[英]Keep only unmatched records when joining tables
我有 2 个包含部分相似数据的访问表,一个比另一个更丰富。 这里的想法是通过字段id和num连接两个表,并从表 T2 中获取不在表 T1 中的 num
T1:
ID | 数 |
---|---|
1 | 34 |
3 | 51 |
7 | 23 |
T2:
ID | 数 | 地位 |
---|---|---|
1 | 34 | 完毕 |
1 | 79 | 完毕 |
1 | 39 | 完毕 |
3 | 51 | 完毕 |
7 | 23 | 完毕 |
预期结果:
ID | 数 | 地位 |
---|---|---|
1 | 79 | 完毕 |
1 | 39 | 完毕 |
在访问下,我在互联网上读到没有像 MySQL 下那样的 MINUS 运算符,所以我尝试使用 EXCEPT 但查询需要很长时间(10 分钟后停止)
所以我尝试了这个:
SELECT T2.*
FROM T2 LEFT JOIN T1 ON (T1.id =T2.id)
WHERE T1.num IS NULL AND ( (T2.status LIKE 'done') );
现在的问题是,我没有 T2 中但 T1 中没有的所有记录
您可以使用右连接。 我建议在这种情况下不要使用“LIKE”,因为这很慢。 您可以只使用 = 运算符。 所以您的查询将是:
SELECT t2.id, t2.num, t2.status
FROM t1
RIGHT JOIN t2
ON t1.id = t2.id
AND t1.num = t2.num
WHERE t1.num IS NULL
AND t2.status = 'done';
如果要加入的所有列名在两个表中都相同,则可以更简单地加入:
SELECT t2.id, t2.num, t2.status
FROM t1
RIGHT JOIN t2
USING (id,num)
WHERE t1.num IS NULL
AND t2.status = 'done';
我不喜欢这个,但它更短。 最后,您的具体查询取决于您的个人“品味”。
有很多变种。
SELECT t2.*
FROM t2
LEFT JOIN t1 USING (id, num)
WHERE t1.id IS NULL
AND t2.status = 'done'
SELECT *
FROM t2
WHERE NOT EXISTS ( SELECT NULL
FROM t1
WHERE (t1.id, t1.num) = (t2.id, t2.num) )
AND status = 'done'
还有更多变种...
这些(或其他)变体中哪一个是最有效的? 这取决于表定义和数据统计。
您缺少加入的条件:
SELECT T2.*
FROM T2
LEFT JOIN T1
ON T1.id = T2.id
AND T1.num = T2.num
WHERE T1.num IS NULL
AND T2.status LIKE 'done';
在这里检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.