SQL查询结果缺失(Missing an attribute)及需求实现问题咨询
Missing an attribute:参与项目2的员工查询结果缺失问题
问题背景
- 本次业务需求:查询曾参与项目2但未参与项目3的员工姓名
- 异常现象:反复核查数据库无异常,但当前查询无法匹配全量参与项目2的3条记录,仅返回2条结果,缺失1名符合条件的员工
现有问题代码
SELECT FNAME, LNAME FROM EMPLOYEE WHERE (SELECT PNO FROM WORKSON WHERE SSN = ESSN AND PNO = 2);
关联表样例数据
WORKSON表
| ESSN | PNO |
|---|---|
| 666884444 | 3 |
| 123456789 | 2 |
| 453453453 | 2 |
| 333445555 | 2 |
| 333445555 | 3 |
当前查询返回结果
| FNAME | LNAME |
|---|---|
| John | Smith |
| Franklin | Wong |
结果缺失的核心原因
现有代码有两个直接导致漏匹配的问题,同时离业务需求的完整逻辑还差一块:
- 关联条件写错了对象:WORKSON表里用来关联员工的字段是
ESSN,正常要匹配到EMPLOYEE表的主键SSN上。但你现在写的WHERE SSN = ESSN,因为WORKSON表根本没有SSN字段,SQL解析的时候会把这个条件当成WORKSON表内部自己跟自己比,完全没接上外层EMPLOYEE表的关联关系。 - 漏写了EXISTS关键字:判断某条员工记录是不是存在对应的WORKSON匹配行,必须用EXISTS修饰子查询,不能直接把查PNO的子查询裸着塞在WHERE后面。不少数据库碰到这种写法,会把子查询返回的PNO值偷偷转成布尔值判断,逻辑根本不可控。
- 缺失排除逻辑:当前代码完全没有写“排除参与项目3员工”的判断,就算修好漏匹配的问题,也会错误把同时参与项目2、3的Franklin Wong包含在结果里。
最后能查到的结果,全是碰巧满足WORKSON表内部自相等条件的那两条项目2记录,ESSN=453453453对应的那条项目2记录,因为不满足这个错误的内部自等条件,被子查询直接筛掉了,自然对应的员工就不会出现在结果里。
符合业务需求的正确写法
SELECT FNAME, LNAME FROM EMPLOYEE e WHERE -- 存在参与项目2的关联记录 EXISTS ( SELECT 1 FROM WORKSON w WHERE w.ESSN = e.SSN AND w.PNO = 2 ) -- 不存在参与项目3的关联记录 AND NOT EXISTS ( SELECT 1 FROM WORKSON w WHERE w.ESSN = e.SSN AND w.PNO = 3 );
内容的提问来源于stack exchange,提问作者L0serkid_
相关产品推荐
相关产品推荐

