我在理解RIGHT OUTER JOIN逻辑时遇到了问题。
我们有两个数据表 - Process
和Resource
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
我们如何使查询返回上面显示的数据的预期结果?我们缺少什么?
答案 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';