如何从数据库单列按升序成对取数(按Source分组)
正确SQL解决方案及问题分析
原SQL的问题点
- 字段赋值错误:把
e1.employee_name同时赋值给employee1和employee2,完全不符合成对需求,还多余查询了e2.employee_name字段。 - JOIN逻辑错误:用
manager_id = employee_id作为连接条件,这是在关联上下级,而非生成任意ID大小符合要求的员工对。 - 冗余操作:
DISTINCT和GROUP BY的使用都没抓住核心问题,反而可能导致结果混乱,因为逻辑本身就偏离需求。
正确实现思路
要生成Source为"A"的员工成对结果,且employee1的ID小于employee2的ID,核心是自连接+ID大小过滤+Source条件:
- 对Employees表做自连接,用别名e1和e2分别代表两个员工。
- 连接条件设置为
e1.employee_id < e2.employee_id,确保每个员工对只出现一次(不会出现e1和e2互换的重复对)。 - 过滤出Source为"A"的员工,保证成对的两个员工都符合Source条件。
正确SQL语句
SELECT e1.employee_name AS employee1, e2.employee_name AS employee2 FROM Employees e1 JOIN Employees e2 ON e1.employee_id < e2.employee_id WHERE e1.Source = 'A' AND e2.Source = 'A' ORDER BY e1.employee_id, e2.employee_id;
补充说明
- 上述语句通过WHERE条件实现了“按Source为'A'分组”的逻辑,只处理该Source下的员工成对组合。
- 不需要
DISTINCT或GROUP BY,因为e1.employee_id < e2.employee_id的条件已经避免了重复对的出现,只要表中employee_id唯一,结果就不会有重复。
内容的提问来源于stack exchange,提问作者Yashawant Sawant
相关产品推荐
相关产品推荐

