繁体   English   中英

连接表时只保留不匹配的记录

[英]Keep only unmatched records when joining tables

我有 2 个包含部分相似数据的访问表,一个比另一个更丰富。 这里的想法是通过字段idnum连接两个表,并从表 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM