SQL自连接查询疑问:调换关联条件后结果为何不符?
自连接条件调换后结果不符的原因分析
正在学习SQL,操作表名为SALESREPS,目标是找出配额(QUOTA)高于其经理的员工。
正确的查询语句及结果
第一个查询语句:
SELECT EMPL.NAME, EMPL.`QUOTA`, MNG.`QUOTA` FROM `SALESREPS` EMPL, `SALESREPS` MNG WHERE MNG.`EMPL_NUM` = EMPL.`MANAGER` AND EMPL.`QUOTA` > MNG.`QUOTA`;
输出结果符合预期,展示的是配额高于经理的员工信息:
+-------------+-----------+-----------+ | NAME | QUOTA | QUOTA | +-------------+-----------+-----------+ | Mary Jones | 300000.00 | 275000.00 | | Larry Fitch | 350000.00 | 275000.00 | | Bill Adams | 350000.00 | 200000.00 | | Dan Roberts | 300000.00 | 200000.00 | | Paul Cruz | 275000.00 | 200000.00 | +-------------+-----------+-----------+
调换条件后的错误查询及结果
修改关联条件并调换FROM子句的表顺序后,查询语句变为:
SELECT EMPL.NAME, EMPL.`QUOTA`, MNG.`QUOTA` FROM `SALESREPS` MNG, `SALESREPS` EMPL WHERE MNG.`MANAGER` = EMPL.`EMPL_NUM` AND EMPL.`QUOTA` > MNG.`QUOTA`;
输出结果不符合预期:
+-------------+-----------+-----------+ | NAME | QUOTA | QUOTA | +-------------+-----------+-----------+ | Sam Clarck | 275000.00 | 200000.00 | | Larry Fitch | 350000.00 | 300000.00 | +-------------+-----------+-----------+
原因分析
这两个查询的核心问题是别名的含义完全搞反了:
- 第一个查询中,
EMPL代表员工,MNG代表该员工的经理:EMPL.MANAGER是员工的经理编号,关联MNG.EMPL_NUM(经理的员工编号),条件EMPL.QUOTA > MNG.QUOTA直接对应“员工配额>经理配额”,完全匹配你的查询目标。 - 第二个查询中,关联条件
MNG.MANAGER = EMPL.EMPL_NUM的含义是:MNG是员工,EMPL是MNG的经理(因为MNG的经理编号等于EMPL的员工编号)。但你在SELECT和WHERE条件里仍沿用了原来的别名逻辑——取EMPL.NAME(经理名字)、EMPL.QUOTA(经理配额),并判断EMPL.QUOTA > MNG.QUOTA,这实际筛选的是“经理配额>员工配额”的记录,和你的目标完全相反,结果自然不符。
比如第二个结果里的Sam Clarck,他的配额275000对应的是经理配额,而MNG.QUOTA是他下属的配额200000,这条记录是“经理配额高于下属”,完全不是你要找的“员工配额高于经理”。
内容的提问来源于stack exchange,提问作者liddell_alex
相关产品推荐
相关产品推荐

