ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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


P
Pranay Rana

https://i.stack.imgur.com/oEEDZ.png

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

https://i.stack.imgur.com/pxUO3.png

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


最后!为什么他们在教科书中没有这些,为什么我在大学的讲师没有这些?!他们使用了世界上最糟糕的解释,与这些解释相差甚远!
这是黄金。我讨厌写一个没有内容但热情洋溢的评论,但是来吧!这是一个很棒的答案。谢谢你,@Pranay Rana。
请为我解释一下,为什么 B.Key IS NULL 但我们仍然可以比较 A.Key = B.Key
@DoNhuVy 很简单,比较在“ON”子句中,如果没有匹配的行,则在 LEFT 或 RIGHT 连接中,然后连接具有所有 NULL 的行,然后测试 IS NULL 以知道没有匹配的行. (顺便说一句,这仅适用于您正在测试的字段不是 NULL,即由于其他原因不能有 NULL)
我正在使用以下查询: SELECT A.* FROM #PurgeFilesListNew A FULL OUTER JOIN #DoNotPurgeFilesListNew B ON A.JobFileId = B.JobFileId AND A.AccountID = B.AccountID WHERE A.JobFileId 为 NULL 或 B.JobFileId 为 NULL 并且A.AccountID IS NULL OR B.AccountID IS NULL 基本上,我在“ON”子句中有两个比较两个值。它工作正常,但查询为那些不匹配的行返回空行。如何解决这个问题?请帮忙
g
gbn
SELECT
   *
FROM
   primarytable P
WHERE
   NOT EXISTS (SELECT * FROM secondarytable S
     WHERE
         P.PKCol = S.FKCol)

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


好吧,他没有发布使用什么 DBRMS,但是在 MySql 中 LEFT JOIN 优于 NOT EXIST
@The Scrum Meister:我说得更快吗?搜索 IN vs EXISTS vs JOIN 以发现语义和逻辑差异......
@gbn对不起,我认为“更好的选择”是指更快。那么您能否解释一下它以哪种方式是更好的选择? explainextended.com/2009/09/18/…
@The Scrum Meister:通常,任何类型的 JOIN 都可能需要 DISTINCT。列表中的 NOT IN 和 null 给出错误。 IN/EXISTS 行为相同。但是,唯一的“安全”构造是(不)存在,除非您喜欢不一致
D
David Sherret

使用“不存在”左连接:

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

U
Unheilig

另一种解决方案是:

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

T
Tommi
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 也为 null 吗?
P
Pranay Rana

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

例子:

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

我为 Progress OpenEdge DB 尝试了这个,但它不起作用。您能否提及您知道这适用于哪些 RDBMS?
J
JennyB

这有助于在 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。

跑得很快,就像一个魅力。