我只需修复一个正在进行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
.然而,第二次返回匹配行a
的时候b.active
是不是'Y'
.在这种情况下,第一个将返回NULL
列的值a
.这是一个微妙的差异.而且,说实话,我认为我没有找到太多用途.