FROM vHWDesktopMonitor A
FULL OUTER JOIN ResourceAssociation B
on A._ResourceGuid = B.ParentResourceGuid
LEFT JOIN vComputer C
on B.ChildResourceGuid = C.Guid
LEFT JOIN vAsset D
on C.ChildResourceGuid = D._ResourceGuid
所以上面会返回
- 来自 A 的所有记录和来自 B 的所有记录(A、B 之间的完整外部)
- 仅来自 C 且位于 B 中的记录(左侧在 B 和 C 之间)
- 仅来自 D 且位于 C 中的记录(左侧在 C 和 D 之间)
但是,如果您应用任何 where 子句限制,它可能会减少由于左连接或外连接而保留的记录......
例如,如果 A._ResourceGuid ='7' 存在于 A 但不在 B 中;并且您设置 where B._ResourceGuid ='7' 然后将保留 A 记录,因为完整的外部联接将被排除(使完整的外部联接与内部联接相同)!
一个完整的外部将返回如下数据:
A B
7 7
2
3
如果你添加一个 where 子句 where B=7 那么你可能期望得到因为完整的外部,因为你说从两者中返回所有记录... AB 7 7 2
但你最终会得到
A B
7 7
因为 where 子句出现在完整的外部之后,因此减少了 A.2 记录。为了弥补这一点,您要么必须在完整的外部执行之前对连接进行限制,要么在 where 子句中处理它(但这种方法非常混乱,容易出现错误和性能问题)
因此,当使用外连接时,您必须将限制标准放在 JOIN 本身上,如下所示。
FROM vHWDesktopMonitor A
FULL OUTER JOIN ResourceAssociation B
on A._ResourceGuid = B.ParentResourceGuid
and B._resourceGuid = '7'
LEFT JOIN vComputer C
on B.ChildResourceGuid = C.Guid
LEFT JOIN vAsset D
on C.ChildResourceGuid = D._ResourceGuid
您也可以将它放在 where 子句中,但您必须记住要考虑表上的所有外部连接并为另一个包含空值(这只是混乱和缓慢)
FROM vHWDesktopMonitor A
FULL OUTER JOIN ResourceAssociation B
on A._ResourceGuid = B.ParentResourceGuid
LEFT JOIN vComputer C
on B.ChildResourceGuid = C.Guid
LEFT JOIN vAsset D
on C.ChildResourceGuid = D._ResourceGuid
WHERE (A._ResourceGuid is null OR B.ParentResourceGuid ='7')