gpt4 book ai didi

SQL Server - 隐式连接与显式不同的结果

转载 作者:行者123 更新时间:2023-12-02 07:24:23 25 4
gpt4 key购买 nike

我的印象是

SELECT *
FROM TableA a
LEFT JOIN TableB b ON a.ID = b.AID AND b.SomeString <> 'ABC'

SELECT *
FROM Table a
LEFT JOIN TableB b ON a.ID = b.AID
WHERE b.AID IS NULL OR b.SomeString <> 'ABC'

会产生相同的结果。

不幸的是,就我而言,它们不是 :-(

为什么他们可能不是?

最佳答案

表A

+----+
| ID |
+----+
| 1 |
| 2 |
| 3 |
+----+

表B

+-----+-----------------+
| AID | SomeString |
+-----+-----------------+
| 1 | SomeOtherString |
| 2 | ABC |
+-----+-----------------+

查询 1

SELECT *
FROM TableA a
LEFT JOIN TableB b
ON a.ID = b.AID
AND b.SomeString <> 'ABC'

这将连接 A 中的每一行来自 B 的每一行匹配a.ID = b.AID AND b.SomeString <> 'ABC' .如果有零行与 A 中的行匹配,则它会保留在结果中 NULL对于表 B 中的列(就像下面的 Id=2 一样——匹配 id 的单行不满足第二个条件,而 Id=3 甚至没有匹配 id 的行)

+----+------+-----------------+
| ID | AID | SomeString |
+----+------+-----------------+
| 1 | 1 | SomeOtherString |
| 2 | NULL | NULL |
| 3 | NULL | NULL |
+----+------+-----------------+

查询1.5

SELECT *
FROM TableA a
LEFT JOIN TableB b ON a.ID = b.AID

这稍微改变了语义,因为现在被认为只匹配 id需要满足谓词而不是字符串条件。在这个新的匹配条件下,A 中 ID 为 2 和 3 的行匹配 B 中的行,并且只有 id=3 被外连接添加回。

+----+------+-----------------+
| ID | AID | SomeString |
+----+------+-----------------+
| 1 | 1 | SomeOtherString |
| 2 | 2 | ABC |
| 3 | NULL | NULL |
+----+------+-----------------+

查询2

SELECT *
FROM TableA a
LEFT JOIN TableB b
ON a.ID = b.AID
WHERE b.AID IS NULL
OR b.SomeString <> 'ABC'

这会运行 WHERE b.AID IS NULL OR b.SomeString <> 'ABC查询 1.5 结果中显示的行的谓词。留给你两排。外连接保留的行就是其中之一。

+----+------+-----------------+
| ID | AID | SomeString |
+----+------+-----------------+
| 1 | 1 | SomeOtherString |
| 3 | NULL | NULL |
+----+------+-----------------+

关于SQL Server - 隐式连接与显式不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35211007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com