在SQL右连接中加入约束做什么吗?

Phi*_*bbs 3 sql postgresql

我只需修复一个正在进行RIGHT JOIN的查询,右侧有一个额外的约束: RIGHT JOIN b ON b.key = a.key AND b.active = 'Y'

它似乎完全无视b.active约束.这是RIGHT JOIN的限制吗?我交换了表格并将b.active约束移到了WHERE中,我从来没有喜欢RIGHT JOIN,我认为这加强了我对它的厌恶.

Gor*_*off 5

这个查询:

SELECT . . .
FROM a RIGHT JOIN
     b
     ON b.key = a.key AND b.active = 'Y'
Run Code Online (Sandbox Code Playgroud)

是相同的:

SELECT . . .
FROM b LEFT JOIN
     a
     ON b.key = a.key AND b.active = 'Y'
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,外连接的"驱动"表都有一个条件.左/右外连接的逻辑是将所有记录保留在一个表中,即使ON条件未评估为真也是如此.因此,该表上的条件不会导致任何过滤.

如果要对该表进行过滤,请使用以下WHERE子句:

SELECT . . .
FROM a RIGHT JOIN
     b
     ON b.key = a.key 
WHERE b.active = 'Y'
Run Code Online (Sandbox Code Playgroud)

我还应该注意,以下两个查询相同:

SELECT . . .
FROM a RIGHT JOIN
     b
     ON b.key = a.key AND b.active = 'Y';
Run Code Online (Sandbox Code Playgroud)

SELECT . . .
FROM a RIGHT JOIN
     b
     ON b.key = a.key;
Run Code Online (Sandbox Code Playgroud)

它们返回相同的行集,假设没有重复的键b.然而,第二次返回匹配行a的时候b.active是不是'Y'.在这种情况下,第一个将返回NULL列的值a.这是一个微妙的差异.而且,说实话,我认为我没有找到太多用途.