如何排除不与另一个表连接的行?
我有两个表,其中一个有主键,另一个有它作为外键。
我想从主表中提取数据,只有当辅助表没有包含它的键的条目时。 对简单内连接的相反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。
冉冉升起,像一个魅力。