SQL多级联接
我需要加入至少4个表。表A是一个关联表,其中包含表B和表C的guid、Parentguid(B)、Childguid(C)。表D仅包含表C的信息 我需要这样的结果 B-C-D 监视器-计算机名称-活动 所以主要的事情是显示所有的B表,只有C表与B相连,只有D表与C相关联 我想我需要子联接()。我仍然是一个新手,这在我的头脑中是有道理的,但我似乎无法使代码正常工作。在过去的两天里,我一直和joins一起玩SQL多级联接,sql,sql-server-2008,join,altiris,Sql,Sql Server 2008,Join,Altiris,我需要加入至少4个表。表A是一个关联表,其中包含表B和表C的guid、Parentguid(B)、Childguid(C)。表D仅包含表C的信息 我需要这样的结果 B-C-D 监视器-计算机名称-活动 所以主要的事情是显示所有的B表,只有C表与B相连,只有D表与C相关联 我想我需要子联接()。我仍然是一个新手,这在我的头脑中是有道理的,但我似乎无法使代码正常工作。在过去的两天里,我一直和joins一起玩 FROM vHWDesktopMonitor mon -- [Sym
FROM vHWDesktopMonitor mon -- [Symantec_CMDB2].[dbo].[ResourceAssociation]
join ResourceAssociation RM on mon._ResourceGuid = RM.ParentResourceGuid
full outer join vComputer comp on RM.ChildResourceGuid = comp.Guid
full outer join vAsset on RM.ChildResourceGuid = vAsset._ResourceGuid
如果我理解正确的话,这两种方法中的任何一种都应该有效。” 或 这应该可以从vHWDesktopMonitor中获取所有记录,并从ResourceAssociation中获取与vHWDesktopMonitor中但不在ResourceAssociation中的任何记录的空值相关的记录。然后,您可以在vComputer中获取与ResourceAssociation中相同的所有记录。最后,您可以在vComputer中获取vAsset中的所有记录当您获取第一个表中的所有记录时,如果您没有关联的记录,则其他表中的文件将为空 如果这不起作用,也许您需要向我们展示一些示例数据和预期结果
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之间)
A B
7 7
2
3
如果你添加了一个where子句,其中B=7,那么你可能会期望得到,因为你说的是返回所有来自这两者的记录。。。
A B
7 7
二,
但你最终会
A B
7 7
因为where子句发生在完全外部之后,因此减少了A.2记录。
为了弥补这一点,您必须在执行完整的外部连接之前对连接进行限制,或者在where子句中处理它(但是这种方法非常混乱,并且容易出现错误和性能问题)
因此,在使用外部联接时,必须对联接本身设置限制条件,如下所示
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子句中,但必须记住考虑表上的所有外部联接,并为另一个联接包含null值(这只是一个混乱而缓慢的过程)
如果您需要表A中的所有数据和表A中的表b中的数据,以及表b中的表c中的数据和表c中的表D中的数据,那么您需要使用左联接。我发现对于新SQL用户特别有用,因为SQL是基于集合的逻辑,大多数情况下……对于我来说,您必须使用3个内部联接mon JOIN RM JOIN comp JOIN Vasset这看起来很有希望。我刚刚用适当的字段尝试了上面的方法。出错了,但我会调整它,并用有效的方法回复。进展不太顺利。我会坚持几天。最终结果应该是。监视器序列号/计算机名/计算机资产状态。但我得到监视器序列号/空值,这是因为你ve监视在一个或多个其他表中没有相应记录的记录。这是正常的左连接行为。
A B
7 7
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
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')