SQL多级联接

时间:2014-10-10 17:38:03

标签: sql sql-server-2008 join altiris

我需要加入至少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 

2 个答案:

答案 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 

所以上面会返回

  • 所有来自B的A和所有记录(A,B之间的完整外部)
  • 只有B中的记录(B和C之间的左边)
  • 只有C中的记录(C和D之间的左边)

但是,如果你应用任何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')