首页 > 解决方案 > JOIN 删除没有条目的行

问题描述

我想显示列,即使它们没有条目来显示它们没有数据。我发现连接需要省略行。

我有两张桌子

|TRADEID | Value |     Date  |                      
|--------|-------|-----------|          
|   a    | 100   | 01/01/2020|                     
|   b    | 500   | 01/01/2020|                      
|   c    | 10    | 01/01/2020|                      
|   d    | 130   | 01/01/2020|      



|  ID | TradeID | Role    | employeeID|
|-----|---------|---------|-----------|
|  1  |   a     | Trader  |   T1      |
|  2  |   a     | Seller  |   S1      |
|  3  |   b     | Trader  |   T1      |
|  4  |   d     | Trader  |   T2      |
|  5  |   d     | Seller  |   S1      |
|  6  |   d     | Reporter|   R1      |

我想结束以下

TradeID | Trader | Seller | Reporter| Value|
---------|--------|--------|---------|------|
  a      |  T1    |   S1   |         | 100  |
  b      |  T1    |        |         | 500  |
  c      |        |        |         |  10  |
  d      |  T2    |  S1    |    R1   | 130  |

我目前的查询是:

select t1.TradeID, r1.employeeID, r2.employeeId, r3.employeeId, t1.value
From tradeTable t1 
join RoleTable r1 on t1.TradeID = r1.TradeID and r1.role = 'Trader'
join RoleTable r2 on t1.TradeId = r2.TradeID and r1.role = 'Seller'
join RoleTable r3 on t1.TradeId = r3.TradeID and r1.role = 'Reporter'

但是,这仅返回行 d,因为它具有所有值。

标签: sqlpivotleft-join

解决方案


你可以left join

select t1.TradeID, r1.employeeID trader, r2.employeeId seller, r3.employeeId reporter, t1.value
from tradeTable t1 
left join RoleTable r1 on t1.TradeID = r1.TradeID and r1.role = 'Trader'
left join RoleTable r2 on t1.TradeId = r2.TradeID and r1.role = 'Seller'
left join RoleTable r3 on t1.TradeId = r3.TradeID and r1.role = 'Reporter'

另一种选择是条件聚合:

select t1.TradeID, 
    max(case when r.role = 'Trader'   then r.employeeID end) trader,
    max(case when r.role = 'Seller'   then r.employeeID end) seller,
    max(case when r.role = 'Reporter' then r.employeeID end) reporter,
    t1.value
from tradeTable t1 
left join RoleTable r
group by t1.TradeID, t1.value

您可能想要测试这两个选项,以评估哪一个对您的数据集更有效。


推荐阅读