如何不用子查询获取t1中与t2匹配id但item不匹配的数据
问题:找出t1中与t2不匹配的记录(禁止使用子查询)
现有表结构
t1(主键:(id, item))
| id | item |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
t2(主键:(id, item))
| id | item |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 3 |
预期输出
| id | item |
|---|---|
| 1 | 3 |
| 2 | 2 |
错误查询分析
你尝试的SQL存在逻辑错误:
select a.id, a.item from t1 a, t2 b, where a.id = b.id and b.item <> b.item;
b.item <> b.item是永远不成立的条件(一个值不可能不等于自身),直接导致过滤逻辑完全失效。另外,逗号连接表的旧式隐式连接写法,本身也不适合用来筛选不匹配的记录。
正确解法(无自查询)
使用LEFT JOIN是不依赖子查询筛选不匹配记录的标准方案:
SELECT a.id, a.item FROM t1 a LEFT JOIN t2 b ON a.id = b.id AND a.item = b.item WHERE b.id IS NULL;
逻辑说明
LEFT JOIN会保留t1的所有记录,同时将t1中与t2主键(id+item)匹配的记录关联起来- 当
t1中的某条记录在t2里找不到对应匹配时,t2的所有字段会被填充为NULL - 通过
WHERE b.id IS NULL就能精准筛选出这些t1独有的、在t2中不存在的记录,完全符合预期输出
内容的提问来源于stack exchange,提问作者Sujeet Chaurasia
相关产品推荐
相关产品推荐

