RIGHT OUTER JOIN 和 WHERE 当有匹配的行时

RIGHT OUTER JOIN and WHERE when there are matching rows

我在理解 RIGHT OUTER JOIN 逻辑时遇到问题。

我们有两个 table 数据 - ProcessResource

Process                             Resource    
ProcessID   ResourceID  Date        ResourceID  ResourceName
1           1           01/01/2015  1           Resource 1
2           1           02/01/2015  2           Resource 2
3           2           02/01/2015          

我们创建了 SELECT 语句

SELECT *
FROM Process P
RIGHT OUTER JOIN Resource R ON P.ResourceID = R.ResourceID
WHERE P.Date = '2015-01-01'

预期的结果是

ProcessID   ResourceID  Date        ResourceID  ResourceName    
1           1           01/01/2015  1           Resource 1  
NULL        NULL        NULL        2           Resource 2  <-- This row is not returned

但是我们只收到一行 - 我们希望每个进程的每个资源都 select,空值 return 从进程 table 中编辑,它们不匹配。

如果我们更改查询并删除 ProcessID 为 3 的行,则查询 returns 两个资源,但我们的示例在我们尚未 selected 的行上有一个连接,所以看起来不被 returned.

SELECT *
FROM Process P
RIGHT OUTER JOIN Resource R ON P.ResourceID = R.ResourceID
WHERE P.Date = '2015-01-01' OR P.Date IS NULL

我们怎样才能使查询return用上面显示的数据得到预期的结果呢?我们缺少什么?

right outer join中,如果要过滤第一个table,条件需要放在on子句中。否则,join 变为 inner join

不过,我鼓励您使用 left outer join。大多数人发现更容易遵循 "keep everything in the first table" 而不是 "keep everything in the last table" 的逻辑。类似的规则成立,但第二个 table 而不是第一个:

SELECT *
FROM Resource R LEFT OUTER JOIN
     Process P
     ON P.ResourceID = R.ResourceID AND P.Date = '2015-01-01';