MYSQL-2 left从两个单独的值连接到同一个表,而无需创建别名



我试图左联接同一个表(映射表(,虽然我可以这样做,因为我正在创建一个别名(联接到同一个表格,但在第一个表格中使用不同的列值(,它重复相同的列(尽管由于别名联接,它们在技术上不同(

场景-我有一名员工被分配了一个组,但他们可能有两个组被分配(由单独的列决定(,这取决于他们是被标记为"在线"还是"离线"。

Emp表

|EMP_ID|Online_Group|Offline_CG|Online |
:----: :----------: :--------: :-----:
|1234  |99          |Null      |Online |
|1223  |88          |Null      |Offline|
|1446  |Null        |77        |Offline|

我正在尝试联接到一个映射表,如果Online_Group Value不为Null,则在映射表上左联接,如果匹配则从映射表返回所有列,而Offline_GroupValue不为Null,则在映像表上左连接,如果匹配返回映射表中的所有列

映射表

|OT_1    |OT_2     |OT_3     |OT_4     |
|:------ |:-------:|:-------:|--------:|
|99      |109      |400      |999      |
|77      |Null     |Null     |878      |

我最接近的方法是创建向左连接(我需要保留在Emp_table中的数据(

select *
from Emp_Table
left join Mapping_Table
on Emp_Table.Online_Group IN(Mapping_Table.OT_1, Mapping_Table.OT_2, 
Mapping_Table.OT_3, Mapping_Table.OT_4)
left join Mapping_Table a
on Emp_Table.Offline_Group
IN(a.Mapping_Table.OT_1, a.Mapping_Table.OT_2, 
a.Mapping_Table.OT_3, a.Mapping_Table.OT_4)

我得到的输出是下面的

|EMP_ID|Online_Group|Offline_CG|Online |OT_1|OT_2|OT_3|OT_4|OT_1|OT_2|OT_3|OT_4| 
|:-----|:----------:|:--------:|:-----:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|1234  |99          |Null      |Online |99  |109 |400 |999 |99  |109 |400 |999 |
|1223  |88          |Null      |Offline|null|null|null|null|null|null|null|null|
|1446  |Null        |77        |Offline|77  |null|null|878 |77  |null|null|878 |

理想情况下,我想要(I.E映射表中没有重复列

|EMP_ID|Online_Group|Offline_CG|Online |OT_1|OT_2|OT_3|OT_4|
|:-----|:----------:|:--------:|:-----:|:--:|:--:|:--:|:--:|
|1234  |99          |Null      |Online |99  |109 |400 |999 |
|1223  |88          |Null      |Offline|null|null|null|null|
|1446  |Null        |77        |Offline|77  |null|null|878 |

表结构似乎有点笨拙,但。。。您不应该需要多个联接。使用类似IF或CASE的方法根据当前状态返回组id,然后联接到映射表。

SELECT e.Emp_Id
, e.Online_Group
, e.Offline_CG 
, m.OT_1 
, m.OT_2 
, m.OT_3 
, m.OT_4
FROM (
SELECT Emp_Id
, Online_Group
, Offline_CG
, IF(Online = 'Online', OnLine_Group, Offline_CG) AS GroupID
FROM   Emp_Table e 
) e 
LEFT JOIN Mapping_Table m ON 
e.GroupId = m.OT_1 OR
e.GroupId = m.OT_2 OR
e.GroupId = m.OT_3 OR
e.GroupId = m.OT_4 

结果:

Emp_Id|Online_Group|Offline_CG|OT_1|OT_2|OT_3|OT_4-----:|----------:|---------:|:---|:---|:---|:---1234|99|null|99|109|400|9991223|88 |null|null|null|null1446 |>null| 77 |2ull| 878

db<gt;小提琴这里

最新更新