RIGHT OUTER JOIN 和 WHERE 当有匹配的行时
RIGHT OUTER JOIN and WHERE when there are matching rows
我在理解 RIGHT OUTER JOIN 逻辑时遇到问题。
我们有两个 table 数据 - 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
但是我们只收到一行 - 我们希望每个进程的每个资源都 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';
我在理解 RIGHT OUTER JOIN 逻辑时遇到问题。
我们有两个 table 数据 - 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
但是我们只收到一行 - 我们希望每个进程的每个资源都 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';