作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的印象是
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 |
+-----+-----------------+
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 |
+----+------+-----------------+
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 |
+----+------+-----------------+
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/
我是一名优秀的程序员,十分优秀!