我只需要修复一个正在执行 RIGHT JOIN 的查询,并在右侧添加一个约束:RIGHT JOIN b ON b.key = a.key AND b.active = 'Y'
它似乎完全忽略了 b.active
约束。这是 RIGHT JOIN 的限制吗?我交换了表格并将 b.active
约束移动到 WHERE,我从来不喜欢 RIGHT JOIN,我认为这加强了我对它的厌恶。
最佳答案
这个查询:
SELECT . . .
FROM a RIGHT JOIN
b
ON b.key = a.key AND b.active = 'Y'
等同于:
SELECT . . .
FROM b LEFT JOIN
a
ON b.key = a.key AND b.active = 'Y'
在这两种情况下,外连接的“驱动”表都有一个条件。左/右外部联接的逻辑是将所有记录保存在一个表中,即使 ON
条件的计算结果不为真。因此,该表的条件不会导致任何过滤。
如果要过滤该表,请使用 WHERE
子句:
SELECT . . .
FROM a RIGHT JOIN
b
ON b.key = a.key
WHERE b.active = 'Y'
我还应该注意以下两个查询不是等价的:
SELECT . . .
FROM a RIGHT JOIN
b
ON b.key = a.key AND b.active = 'Y';
和
SELECT . . .
FROM a RIGHT JOIN
b
ON b.key = a.key;
它们返回相同的一组行,假设 b
中没有重复键。但是,当 b.active
不是 'Y'
时,第二个将返回 a
中的匹配行。在这种情况下,第一个将为 a
中的列返回 NULL
值。这是一个微妙的区别。而且,老实说,我认为我从未发现它有多大用处。
关于sql - SQL 右连接中的连接约束有什么作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34025854/