繁体   English   中英

如何在sql中使用3个表进行完全外连接?

[英]how to full outer join with 3 tables in sql?

我有 3 张桌子:

表 1 : "vw_dimserver" :[ServerKey,ServerNm,ServerCurrentAssignedToNm] 例如:[1234,hasgapp0108,Aya]

table2 "vw_DimWorker" : [WorkerEmailNm, WorkerIdsid] 。 例如: [Aya, akhate] , [Genna,gshysh] , [mish,mishka] (就像名字和用户名)

表 3 "vw_FactHardwareAssetContact" : [ServerKey,HardwareAssetWorkerKey, HardwareAssetContactTypeNm]。 例如: [1234,Aya,support] [1234,Genna,Customer] [1234,Mish,patch] (它是服务器密钥和联系人姓名和联系人类型,如果是支持或客户或补丁)

我需要输出在一行中:[ServerNm,WorkerIdsid of the ServerCurrentAssignedToNm, WorkerIdsid of the Customer, WorkerIdsid of the support] [hasgapp0108,akhate,gshysh,mishka]

现在我需要加入用户名表来获取每个用户的用户名。 我用全外连接做到了。

代码是:

选择 vw_dimserver.ServerNm 作为主机名,(vw_DimWorker1.WorkerIdsid) 作为用户名,(vw_DimWorker2.WorkerIdsid) 作为 [主要支持联系人],(vw_DimWorker3.WorkerIdsid) 作为 [主要客户联系人]

from vw_dimserver
        inner join vw_FactHardwareAssetContact  on vw_dimserver.ServerKey = vw_FactHardwareAssetContact.HardwareAssetKey 
    inner join vw_DimWorker as vw_DimWorker1  on  vw_DimWorker1.WorkerEmailNm = vw_dimserver.ServerCurrentAssignedToNm  
    full outer join  vw_DimWorker as  vw_DimWorker2 on   CONVERT(varchar(11),vw_FactHardwareAssetContact.HardwareAssetWorkerKey )  = vw_DimWorker2.workerWWID and vw_FactHardwareAssetContact.HardwareAssetContactTypeNm = 'Support' and vw_FactHardwareAssetContact.HardwareAssetPrimaryInd = '1'  and( vw_FactHardwareAssetContact.HardwareAssetWorkerKey is not NULL)
   full outer  join   vw_DimWorker as  vw_DimWorker3 on   CONVERT(varchar(11),vw_FactHardwareAssetContact.HardwareAssetWorkerKey )  = vw_DimWorker3.workerWWID and vw_FactHardwareAssetContact.HardwareAssetContactTypeNm = 'Customer' and vw_FactHardwareAssetContact.HardwareAssetPrimaryInd = '1' and( vw_FactHardwareAssetContact.HardwareAssetWorkerKey is not NULL)
where vw_dimserver.ServerNm ='hasgapp0108'   and (vw_DimWorker2.workerWWID is  not null or vw_DimWorker3.workerWWID is not null ) and ( ServerCurrentSubStatusCd != 'duplicate_error' or ServerCurrentSubStatusCd is NULL )

输出是两行:

[主机名用户名支持客户]

[hasgapp0108 akhate NULL gshysh],

[hasgapp0108 akhate akhate NULL]

我需要它是一行:

[主机名用户名支持客户]

[hasgapp0108 akhate akhate gshysh]

我的经理不接受解决方案:

select max(username1),max(username2)...

我需要用连接来做。

用内连接和 group_concat 试试这个:

    SELECT vw_dimserver.ServerNm as hostname , group_concat(vw_DimWorker1.WorkerIdsid) as username, group_concat(vw_DimWorker2.WorkerIdsid) as [Primary Support Contact], group_concat(vw_DimWorker3.WorkerIdsid) as [Primary Customer Contact]

from vw_dimserver
        inner join vw_FactHardwareAssetContact  on vw_dimserver.ServerKey = vw_FactHardwareAssetContact.HardwareAssetKey 
    inner join vw_DimWorker as vw_DimWorker1  on  vw_DimWorker1.WorkerEmailNm = vw_dimserver.ServerCurrentAssignedToNm  
    full outer join  vw_DimWorker as  vw_DimWorker2 on   CONVERT(varchar(11),vw_FactHardwareAssetContact.HardwareAssetWorkerKey )  = vw_DimWorker2.workerWWID and vw_FactHardwareAssetContact.HardwareAssetContactTypeNm = 'Support' and vw_FactHardwareAssetContact.HardwareAssetPrimaryInd = '1'  and( vw_FactHardwareAssetContact.HardwareAssetWorkerKey is not NULL)
   full outer  join   vw_DimWorker as  vw_DimWorker3 on   CONVERT(varchar(11),vw_FactHardwareAssetContact.HardwareAssetWorkerKey )  = vw_DimWorker3.workerWWID and vw_FactHardwareAssetContact.HardwareAssetContactTypeNm = 'Customer' and vw_FactHardwareAssetContact.HardwareAssetPrimaryInd = '1' and( vw_FactHardwareAssetContact.HardwareAssetWorkerKey is not NULL)
where vw_dimserver.ServerNm ='hasgapp0108'   and (vw_DimWorker2.workerWWID is  not null or vw_DimWorker3.worker
group by vw_dimserver.ServerNm

如果您只需要匹配结果,则可以使用内部联接

    SELECT
      s.ServerKey,
      s.ServerNm,
      group_concat(w.WorkerIdsid)
    FROM vw_dimserver s
    INNER JOIN vw_FactHardwareAssetContact c
      ON s.ServerKey = c.ServerKey
    INNER JOIN vw_DimWorker w
      ON c.HardwareAssetWorkerKey = w.WorkerEmailNm
    GROUP BY s.ServerKey,
             s.ServerNm

或者如果没有全部匹配,您可以使用左连接

SELECT
  s.ServerKey,
  s.ServerNm,
  group_concat(w.WorkerIdsid)
FROM vw_dimserver s
LEFT JOIN vw_FactHardwareAssetContact c
  ON s.ServerKey = c.ServerKey
LEFT JOIN vw_DimWorker w
  ON c.HardwareAssetWorkerKey = w.WorkerEmailNm
GROUP BY s.ServerKey,
         s.ServerNm

选择 vw_dimserver.ServerNm 作为主机名,(vw_DimWorker1.WorkerIdsid) 作为用户名,(vw_DimWorker2.WorkerIdsid) 作为 [主要支持联系人],(vw_DimWorker3.WorkerIdsid) 作为 [主要客户联系人]

来自 vw_dimserver

全外连接 vw_FactHardwareAssetContact as vw_FactHardwareAssetContact1 on (vw_dimserver.ServerKey = vw_FactHardwareAssetContact1.HardwareAssetKey 和 vw_FactHardwareAssetContact1.HardwareAssetContactTypeNm = 'SupportHardwAssetInact')

在 CONVERT(varchar(11),vw_FactHardwareAssetContact1.HardwareAssetWorkerKey) = vw_DimWorker1.workerWWID 上完全外连接 vw_DimWorker 作为 vw_DimWorker1

全外连接 vw_DimWorker 作为 assings on assings.WorkerEmailNm = vw_dimserver.ServerCurrentAssignedToNm

全外连接 vw_FactHardwareAssetContact as vw_FactHardwareAssetContact2 on (vw_dimserver.ServerKey = vw_FactHardwareAssetContact2.HardwareAssetKey and vw_FactHardwareAssetContact2.HardwareAssetContactTypeNm = 'CustomardContactTypeNm = 'CustomardContactTypeNm = 'CustomardContaryAst')

在 CONVERT(varchar(11),vw_FactHardwareAssetContact2.HardwareAssetWorkerKey) = vw_DimWorker2.workerWWID 上完全外连接 vw_DimWorker 作为 vw_DimWorker2

完整的 OUTER 加入 vw_FactHardwareAssetContact as vw_FactHardwareAssetContact11 on (vw_dimserver.ServerKey = vw_FactHardwareAssetContact11.HardwareAssetKey 和 vw_FactHardwareAssetContact11.HardwareAssetContactSupportTypeNardwAsset'vw_FactHardwareAssetContact11'和 vw_FactHardwareAssetContact11'vw_FactHardwareAssetContact11.HardwareAssetKey'and'

在 CONVERT(varchar(11),vw_FactHardwareAssetContact11.HardwareAssetWorkerKey) = vw_DimWorker11.workerWWID 上完全外连接 vw_DimWorker 作为 vw_DimWorker11

完整的 OUTER 加入 vw_FactHardwareAssetContact as vw_FactHardwareAssetContact22 on (vw_dimserver.ServerKey = vw_FactHardwareAssetContact22.HardwareAssetKey 和 vw_FactHardwareAssetContact22.HardwareAssetContactTypeFardws1'和 vw_FactHardwareAssetContact22 = vw_FactHardwareAssetContact22.HardwareAssetKey 和 vw_FactHardwareAssetContact22.HardwareAssetContactTypeNm)和

在 CONVERT(varchar(11),vw_FactHardwareAssetContact22.HardwareAssetWorkerKey) = vw_DimWorker22.workerWWID 上完全外连接 vw_DimWorker 作为 vw_DimWorker22

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM