我需要加入至少4个表。表A是一个关联表,其中包含表B和C,父节(B),Childguid(C)的guid。表D仅包含表C的信息。
我需要结果看起来像这样。
B - C - D
监视器 - 计算机名称 - 活动
所以主要的是显示所有B表,只有连接到B的C表,只有D表与C相关联。
我怀疑我需要子连接()。我仍然是一个新手,它在我的头脑中是有道理的,但我似乎无法使代码工作。我在过去两天玩过加入。
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
答案 0 :(得分:0)
如果我理解你的话,其中任何一个都应该有用“
FROM vHWDesktopMonitor mon -- [Symantec_CMDB2].[dbo].[ResourceAssociation]
left join ResourceAssociation RM on mon._ResourceGuid = RM.ParentResourceGuid
left join vComputer comp on RM.ChildResourceGuid = comp.Guid
left join vAsset on comp.Guid = vAsset._ResourceGuid
或
FROM vHWDesktopMonitor mon -- [Symantec_CMDB2].[dbo].[ResourceAssociation]
left join ResourceAssociation RM on mon._ResourceGuid = RM.ParentResourceGuid
left join (select [list fields here] from vComputer comp
join vAsset on comp.Guid = vAsset._ResourceGuid) comp2
on RM.ChildResourceGuid = comp2.Guid
这应该可以获取vHWDesktopMonitor中的所有记录以及来自ResourceAssociation的所有记录,其中包含vHWDesktopMonitor中任何记录的空值,但不包括ResourceAssociation中的记录。然后,您在vComputer中获得也在ResourceAssociation中的记录。最后,您将获得vComputer中的vAsset中的记录。当你在第一张表中获得所有记录时,如果你没有相关的记录,那么tehere将是其他表格中的整数。
如果这不起作用,您可能需要向我们展示一些样本数据和预期结果。
答案 1 :(得分:0)
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中存在A._ResourceGuid ='7'但不在B中; 并设置B._ResourceGuid ='7'的位置,否则A记录将被保留,因为完全外连接将被排除(使完整外连接与INNER JOIN相同)!
一个Full outer将返回如下数据:
A B
7 7
2
3
如果你添加一个where子句,其中B = 7,那么你可能会期望得到因为你说从两个都返回所有记录的完整外部... 一个B. 7 7 2
但你最终会得到
A B
7 7
因为where子句在完全外部之后发生,因此减少了A.2记录。 为了弥补这一点,您必须在完全外部执行之前对teh join设置限制或在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')