Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL多级联接_Sql_Sql Server 2008_Join_Altiris - Fatal编程技术网

SQL多级联接

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

我需要加入至少4个表。表A是一个关联表,其中包含表B和表C的guid、Parentguid(B)、Childguid(C)。表D仅包含表C的信息

我需要这样的结果

B-C-D

监视器-计算机名称-活动

所以主要的事情是显示所有的B表,只有C表与B相连,只有D表与C相关联

我想我需要子联接()。我仍然是一个新手,这在我的头脑中是有道理的,但我似乎无法使代码正常工作。在过去的两天里,我一直和joins一起玩

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之间)
但是,如果应用任何where子句限制,则可能会减少由于左联接或外联接而保留的记录

例如,如果A._ResourceGuid='7'存在于A中,但不在B中; 如果您设置了B._ResourceGuid='7',则会保留A记录,因为完全外部联接将被排除(使完全外部联接与内部联接相同)

完整的外部文件将返回如下数据:

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')