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

时间:2010-12-30 06:21:36

标签: sql join

我有两个表,一个有主键,另一个有外键。

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

7 个答案:

答案 0 :(得分:221)

alt text

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

加入的完整图像 alt text

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

答案 1 :(得分:7)

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

通常(NOT) EXISTS是更好的选择(NOT) IN(LEFT) JOIN

答案 2 :(得分:4)

使用“不存在”左连接:

SELECT p.*
FROM primary_table p LEFT JOIN second s ON p.ID = s.ID
WHERE s.ID IS NULL

答案 3 :(得分:3)

SELECT P.*
FROM primary_table P
LEFT JOIN secondary_table S on P.id = S.p_id
WHERE S.p_id IS NULL

答案 4 :(得分:2)

如果要选择第一个表中的列“也存在于第二个表中,那么在这种情况下,您也可以使用EXCEPT。在这种情况下,列名称也可以不同但数据类型应该是一样的。

示例:

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

答案 5 :(得分:1)

另一个解决方案是:

SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)

答案 6 :(得分:0)

这有助于在COGNOS中使用,因为在Cognos中创建SQL“Not in”语句是允许的,但运行时间太长。我手动编码表A以加入到Cognos中的表B,作为A.key“不在”B.key中,但是查询花了太长时间/ 5分钟后没有返回结果。

对于在Cognos中寻找“NOT IN”解决方案的任何其他人来说,这就是我所做的。通过选择链接类型创建一个通过Cognos中的LEFT JOIN连接表A和B的查询:表A.Key在表B中具有“0到N”值,然后为:表B添加了一个过滤器(这些对应于Where子句) .Key为NULL。

快跑,喜欢魅力。