如何用SQL返回无排列重复的1990年后出生DEFCON获胜黑客对?
解决无重复黑客对的SQL方案
嘿,我来帮你搞定这个SQL问题!要生成无排列重复的符合条件的黑客对,核心思路是先筛选出合格的黑客,再通过自连接时的条件限制来避免重复对。
步骤拆解
先锁定符合条件的黑客
我们需要先找出同时满足两个条件的黑客:- 获得过DEFCON竞赛冠军(关联
winners表) - 出生于1990年之后(过滤
hackers的birthday字段)
用CTE(公共表表达式)来整理这个合格列表,还能顺便去重(避免同一黑客多次获奖导致重复记录)。
- 获得过DEFCON竞赛冠军(关联
自连接生成无重复对
把合格黑客列表自连接,关键是用h1.name < h2.name这个条件——这样每对黑客只会按“名字字典序从小到大”出现一次,绝对不会返回(zix, wix)和(wix, zix)这种重复排列。
完整SQL代码
WITH qualified_hackers AS ( SELECT h.name FROM hackers h INNER JOIN winners w ON h.name = w.hacker WHERE h.birthday >= '1991-01-01' -- 确保是1990年之后出生(含1991年1月1日) GROUP BY h.name -- 去重:同一黑客多次获奖只保留一条记录 ) SELECT h1.name AS hacker_pair_first, h2.name AS hacker_pair_second FROM qualified_hackers h1 INNER JOIN qualified_hackers h2 ON h1.name < h2.name;
补充说明
- 关于生日条件:如果你的
birthday字段是DATE类型,用>= '1991-01-01'比> '1990-12-31'更直观,效果完全一致。 - 如果不用CTE,也可以把
qualified_hackers换成子查询,逻辑是一样的。 - 为什么之前的尝试可能失败?大概率是没在自连接时加
h1.name < h2.name的限制,或者用了!=这种会返回正反两对的条件。
内容的提问来源于stack exchange,提问作者user8206962
相关产品推荐
相关产品推荐

