SQL查询求助:如何获取表A中UniqueKey在B不在C的行?
搞定你的SQL查询需求:获取符合条件的表A数据
嘿,我来帮你解决这个SQL查询的问题!先明确你的核心需求:从表A中捞取那些对应的unique_key存在于表B,同时这个unique_key又不在表C里的行,最终要返回id、name、int_value和表B的unique_key字段。
先说说你尝试的两条SQL为啥不对
- 第一条SQL里用
LEFT JOIN ... ON b.unique_key <> c.unique_key,这逻辑完全跑偏了——只要B的key和C的key不一样就会生成关联行,结果会出来一堆不符合要求的数据,根本实现不了“不在C里”的过滤。 - 第二条SQL思路其实沾边了,但你犯了个小错误:从B的子查询里只选了
id,导致b.unique_key这个字段根本不存在,自然查不到正确结果;而且就算字段对了,子查询的写法也没必要这么绕。
给你两种靠谱的正确写法
写法一:JOIN + IS NULL 过滤
这种写法用关联查询加空值过滤,效率也不错:
SELECT a.id, a.Name, a.int_value, b.unique_key FROM A a INNER JOIN B b ON a.id = b.id -- 先确保A的行在B中有对应(满足unique_key存在于B的要求) LEFT JOIN C c ON b.unique_key = c.unique_key WHERE c.unique_key IS NULL; -- 过滤掉那些在C中存在的unique_key
写法二:NOT EXISTS 子查询
这种方式逻辑更直观,读起来一目了然,适合复杂条件的场景:
SELECT a.id, a.Name, a.int_value, b.unique_key FROM A a INNER JOIN B b ON a.id = b.id WHERE NOT EXISTS ( -- 检查当前B的unique_key是否在C中存在,不存在就保留该行 SELECT 1 FROM C c WHERE c.unique_key = b.unique_key );
验证结果
这两种写法都会精准返回你想要的结果:
| id | Name | int_value | unique_key |
|---|---|---|---|
| a3 | cc | 5 | u5 |
因为u5在表B里有,但表C里完全找不到这个unique_key,完美符合你的需求。
内容的提问来源于stack exchange,提问作者Juno J
相关产品推荐
相关产品推荐

