如何排除不与另一个表连接的行?

我有两个表,其中一个有主键,另一个有它作为外键。

我想从主表中提取数据,只有当辅助表没有包含它的键的条目时。 对简单内连接的相反sorting,它只返回通过该键连接在一起的行。

替代文字

SELECT <select_list> FROM Table_A A LEFT JOIN Table_B B ON A.Key = B.Key WHERE B.Key IS NULL 

join的完整图像 替代文字

来自aticle: http : //www.codeproject.com/KB/database/Visual_SQL_Joins.aspx

 SELECT * FROM primarytable P WHERE NOT EXISTS (SELECT * FROM secondarytable S WHERE P.PKCol = S.FKCol) 

一般来说(NOT) EXISTS(NOT) IN(LEFT) JOIN的更好select

使用“不存在”左连接:

 SELECT p.* FROM primary_table p LEFT JOIN second s ON p.ID = s.ID WHERE s.ID IS NULL 
 SELECT P.* FROM primary_table P LEFT JOIN secondary_table S on P.id = S.p_id WHERE S.p_id IS NULL 

如果你想从第一个表中select第二个表中的列,那么在这种情况下,你也可以使用EXCEPT 。在这种情况下,列名也可以不同,但​​数据types应该是相同的。

例:

 select ID, FName from FirstTable EXCEPT select ID, SName from SecondTable 

这对于在COGNOS中使用很有帮助,因为在Cognos中创buildSQL“Not in”语句是允许的,但运行时间太长。 我已经在Cognos中手动编码表A以join到表B中A.key“not in”B.key,但是查询耗时过长/ 5分钟后没有返回结果。

对于在Cognos中寻找“不在”解决scheme的任何人,这就是我所做的。 通过select链接types,在Cognos中创build一个使用LEFT JOIN连接表A和B的查询:表A.A。在表B中具有“0到N”值,然后为表B添加一个filter(这些对应于Where子句) .Key是NULL。

冉冉升起,像一个魅力。