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

时间:2015-02-26 11:59:02

标签: sql sql-server join outer-join

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

我们有两个数据表 - 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

但是我们只收到一行 - 我们希望我们选择的每个进程都有每个资源,从进程表返回的空值不匹配。

如果我们更改查询并删除ProcessID为3的行,则查询将返回两个资源,但我们的示例在我们尚未选择的行上有一个连接,因此似乎不会返回。

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

我们如何使查询返回上面显示的数据的预期结果?我们缺少什么?

1 个答案:

答案 0 :(得分:2)

right outer join中,如果要对第一个表进行过滤,则条件需要包含在on子句中。否则,join变为inner join

但是,我建议您使用left outer join。大多数人发现更容易遵循“将所有内容保存在第一个表中”的逻辑,而不是“将所有内容保留在最后一个表中”。类似的规则也适用,但对于第二个表而不是第一个表:

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