如何筛选不认识任何参加Workshop的人员 现有SQL查询无结果排查
问题原因梳理
你的SQL执行无结果主要有以下3个核心问题:
- 字段名引用错误
你代码中使用的personA_id、personB_id和实际表结构不符:Knows表的字段为PersonX(对应你写的personA_id)、PersonY(对应你写的personB_id),字段名不匹配会直接导致查询报错或无符合条件的结果。 - 左连接的NULL值被WHERE条件过滤
你用左连接得到了无相识关系的人员记录(也就是Adam这类人,关联后Knows相关字段全为NULL),但K.PersonY NOT IN (...)的判断逻辑中,NULL和任何值做比较的结果都是UNKNOWN,不会被WHERE条件命中,直接把符合要求的无相识关系的人员排除了。 - 逻辑判断不符合需求
你要筛选的是「不认识任何参加讲习班的人」,核心逻辑是不存在任何一个该用户认识的人,属于参加了讲习班的集合,直接用NOT IN的写法无法覆盖「用户没有认识的人」的场景。
修正后的SQL写法
推荐用NOT EXISTS实现,逻辑更清晰也能避免NULL值问题:
SELECT DISTINCT P.name, P.id FROM Persons P WHERE NOT EXISTS ( -- 查找该用户认识的人中有没有参加讲习班的,找不到就符合条件 SELECT 1 FROM Knows K JOIN TakingWorkshop T ON K.PersonY = T.person_id WHERE K.PersonX = P.id )
你原始的左连接写法也可以调整后使用,需要把过滤条件放到ON子句里,同时补充NULL值判断:
SELECT DISTINCT P.name, P.id FROM Persons P LEFT JOIN Knows K ON P.id = K.PersonX AND K.PersonY IN (SELECT person_id FROM TakingWorkshop) WHERE K.PersonX IS NULL -- 找不到符合上面关联条件的记录,说明没有认识的人参加讲习班
两种写法最终返回的符合条件的人员都是:Laura Jansen、Sana Vendi、Adam Smith、Mo Zora,和你预期的结果一致。
内容的提问来源于stack exchange,提问作者vivalasana
相关产品推荐
相关产品推荐

