我有两个表,一个有主键,另一个有外键。
我想从主表中提取数据,只有当辅助表不有一个包含它的键的条目时。与简单内连接相反的排序,它仅返回通过该键连接在一起的行。
答案 0 :(得分:221)
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL
加入的完整图像
来自文章: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。
快跑,喜欢魅力。