选择不在其他表sql server中的字段组合

Posted

技术标签:

【中文标题】选择不在其他表sql server中的字段组合【英文标题】:Select combination of fields not in other table sql server 【发布时间】:2019-02-20 17:45:32 【问题描述】:

假设我有这两个表:

    Table 1                        Table 2
  PName  |   FID                 PName   |  FID
  ----------------               ---------------
  Dog    |   1                   Dog     |  1
  Dog    |   2                   Cat     |  2
  Cat    |   2                   Cat     |  4
  Cat    |   3

什么是正确的查询来选择第二个表中不存在的第一个表的两个字段组合?

我想得到的是

    Table 1                      
  PName  |   FID                 
  ----------------               
  Dog    |   2                   
  Cat    |   3

会这样吗?

SELECT * FROM [Table 1] WHERE ([Table 1].[PName] NOT IN (SELECT [Table 2].[PName] FROM [Table 2]) AND ([Table 1].[FID] NOT IN (SELECT [Table 2].[FID] FROM [Table 2]))

【问题讨论】:

@user7733611 您发布了指向此问题的链接 谢谢,我想知道为什么它不起作用...***.com/questions/8165534/… 【参考方案1】:

我会使用except

select * from table1
except
select * from table2

值得一提的是this great answer 讨论exceptnot in,尤其是关于NULL

【讨论】:

【参考方案2】:

我可能会建议如下:

select t1.* 
from table1 t1 
where not exists (select 1  
                  from table2 t2 
                  where t2.pname = t1.pname and t2.fid = t1.fid
                 );

【讨论】:

这对 mysql 等其他技术很有用,谢谢。【参考方案3】:

你需要一个左连接并且只取不匹配的行:

select t1.*
from t1 left join t2
on t1.pname = t2.pname and t1.fid = t2.fid
where t2.pname is null and t2.fid is null

见demo

【讨论】:

以上是关于选择不在其他表sql server中的字段组合的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 视图中选择值(如果存在)或其他值(如果不在 SQL Server 视图中)

SQL server 一些小结

SQL SERVER 从 If Exists 中选择多个字段

SQL join:当值不在一组值中时如何选择

如何使用 SQL Server 返回不在表中的 id

SQL中,如何查询存在一个表的字段而不在另一个表的字段中的数据记录?