Mysql 如何在sql中与3个表进行完全外部联接?

Mysql 如何在sql中与3个表进行完全外部联接?,mysql,Mysql,我有三张桌子: 表1:“vw_dimserver”:[ServerKey,ServerNm,ServerCurrentAssignedToNm]例如:[1234,hasgapp0108,Aya] 表2“vw_DimWorker”:[WorkerEmailNm,WorkerIdsid]。例如:[Aya,akhate],[Genna,gshysh],[mish,mishka](就像名字和用户名一样) 表3“vw_FactHardwareAssetContact”:[ServerKey,Hardwar

我有三张桌子:

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

表2“vw_DimWorker”:[WorkerEmailNm,WorkerIdsid]。例如:[Aya,akhate],[Genna,gshysh],[mish,mishka](就像名字和用户名一样)

表3“vw_FactHardwareAssetContact”:[ServerKey,HardwareAssetWorkerKey,HardwareAssetContactTypeNm]。例如:[1234,Aya,支持] [1234,Genna,客户] [1234,Mish,修补程序](如果是支持、客户或修补程序,则为服务器密钥、联系人名称和联系人类型)

我需要输出在一行中: [ServerNm,ServerCurrentAssignedToNm的WorkerIdsid,客户的WorkerIdsid,支持的WorkerIdsid] [hasgapp0108,akhate,gshysh,mishka]

现在我需要与usernames表连接以获取每个用户的用户名。 我是用完全的外接做的

代码是:

挑选 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)...

我需要使用连接来完成此操作。

尝试使用内部连接和组连接:

    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)作为[主要客户联系人]

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 )
来自vw_dimserver

完全外部连接vw_FactHardwareAssetContact作为vw_FactHardwareAssetContact1 on(vw_dimserver.ServerKey=vw_FactHardwareAssetContact1.HardwareAssetKey和vw_FactHardwareAssetContact1.HardwareAssetContactTypeNm='Support'和vw_FactHardwareAssetContact1.HardwareAssetPrimaryId='1')

转换时将vw_DimWorker作为vw_DimWorker1进行完全外部连接(varchar(11),vw_FactHardwareAssetContact1.HardwareAssetWorkerKey)=vw_DimWorker1.WorkerWid

完全外部连接vw_DimWorker作为assings上的assings.WorkerEmailNm=vw_dimserver.ServerCurrentAssignedToNm上的assings

完全外部连接vw_FactHardwareAssetContact作为vw_FactHardwareAssetContact2 on(vw_dimserver.ServerKey=vw_FactHardwareAssetContact2.HardwareAssetKey和vw_FactHardwareAssetContact2.HardwareAssetContactTypeNm='Customer'和vw_FactHardwareAssetContact2.HardwareAssetPrimaryId='1')

转换时将vw_DimWorker作为vw_DimWorker2进行完全外部连接(varchar(11),vw_FactHardwareAssetContact2.HardwareAssetWorkerKey)=vw_DimWorker2.WorkerWid

完全外部连接vw_FactHardwareAssetContact作为vw_FactHardwareAssetContact11打开(vw_dimserver.ServerKey=vw_FactHardwareAssetContact11.HardwareAssetKey和vw_FactHardwareAssetContact11.HardwareAssetContactTypeNm='Support'和vw_FactHardwareAssetContact11.HardwareAssetPrimaryId='0')

转换时将vw_DimWorker作为vw_DimWorker11进行完全外部连接(varchar(11),vw_FactHardwareAssetContact11.HardwareAssetWorkerKey)=vw_DimWorker11.WorkerWid

完全外部连接vw_FactHardwareAssetContact作为vw_FactHardwareAssetContact22 on(vw_dimserver.ServerKey=vw_FactHardwareAssetContact22.HardwareAssetKey和vw_FactHardwareAssetContact22.HardwareAssetContactTypeNm='Customer'和vw_FactHardwareAssetContact11.HardwareAssetPrimaryId='0')


完全外部连接vw_DimWorker作为vw_DimWorker22转换(varchar(11),vw_FactHardwareAssetContact22.HardwareAssetWorkerKey)=vw_DimWorker22.workerwid

在你的问题中,你只有2个表,而不是3.我编辑了我的帖子,请参见