【发布时间】:2011-06-01 10:06:50
【问题描述】:
我有两张表,一张有主键,另一张有外键。
我想从主表中提取数据,前提是辅助表没有包含包含它的键的条目。与简单的内连接相反,它只返回通过该键连接在一起的行。
【问题讨论】:
我有两张表,一张有主键,另一张有外键。
我想从主表中提取数据,前提是辅助表没有包含包含它的键的条目。与简单的内连接相反,它只返回通过该键连接在一起的行。
【问题讨论】:
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
【讨论】:
B.Key IS NULL 但我们仍然可以比较A.Key = B.Key?
SELECT
*
FROM
primarytable P
WHERE
NOT EXISTS (SELECT * FROM secondarytable S
WHERE
P.PKCol = S.FKCol)
一般来说,(NOT) EXISTS 是比(NOT) IN 或(LEFT) JOIN 更好的选择
【讨论】:
LEFT JOIN 优于 NOT EXIST
使用“不存在”的左连接:
SELECT p.*
FROM primary_table p LEFT JOIN second s ON p.ID = s.ID
WHERE s.ID IS NULL
【讨论】:
另一种解决方案是:
SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)
【讨论】:
SELECT P.*
FROM primary_table P
LEFT JOIN secondary_table S on P.id = S.p_id
WHERE S.p_id IS NULL
【讨论】:
P.key = S.key 然后说 where S.key IS NULL ,那么这不是使 P.key 也为空吗?
如果您想从“第一表”中选择第二个表中也存在的列,那么在这种情况下,您也可以使用EXCEPT。在这种情况下,列名也可以不同,但数据类型应该是一样。
示例:
select ID, FName
from FirstTable
EXCEPT
select ID, SName
from SecondTable
【讨论】:
这有助于在 COGNOS 中使用,因为允许在 Cognos 中创建 SQL“Not in”语句,但运行时间太长。我已经手动将表 A 编码为在 Cognos 中作为 A.key“不在”B.key 中加入表 B,但是查询花费的时间太长/5 分钟后没有返回结果。
对于在 Cognos 中寻找“NOT IN”解决方案的其他人,这就是我所做的。通过选择链接类型在 Cognos 中创建一个使用 LEFT JOIN 连接表 A 和 B 的查询:表 A.Key 在表 B 中具有“0 到 N”值,然后为表 B 添加了一个过滤器(这些对应于 Where 子句) .Key 为 NULL。
跑得快,像个魅力。
【讨论】: