【问题标题】:Flattening data in SQL server by joining multiple tables通过连接多个表来扁平化 SQL Server 中的数据
【发布时间】:2020-06-01 11:15:27
【问题描述】:

出于数据分析的目的,我想展平父子表。 我有服务订单表 tssoc210 作为

orno|acln
1   |10 
1   |20
2   |20
.
.

它的活动(劳动力、材料、其他)在另外 3 个表中维护为 tssoc220(劳务用)

orno|acln|lino|invn|eqan|asto
1   |10  |A   |600 |2   |120
1   |10  |B   |607 |1   |100
.
.

tssoc230(用于材料)

orno|acln|lino|invn|eqan|asto
1   |10  |L1  |700 |1   |110
1   |10  |L2  |704 |3   |200
1   |10  |L3  |407 |4   |100
1   |20  |L1  |708 |1   |100  
2   |20  |L1  |790 |1   |200
.
.

tssoc240(其他)

orno|acln|lino|invn|eqan|asto
1   |10  |M1  |400 |2   |500
2   |20  |M1  |490 |1   |100
.
.

我想加入这些表格

orno|acln|l_lino|l_invn|l_eqan|l_asto|m_lino|m_invn|m_eqan|m_asto|o_lino|o_invn|o_eqan|o_asto
1   |10  |A     |600   |2     |120   |NULL  |NULL  |NULL  |NULL  |NULL  |NULL  |NULL  |NULL
1   |10  |B     |607   |1     |100   |NULL  |NULL  |NULL  |NULL  |NULL  |NULL  |NULL  |NULL
1   |10  | NULL |NULL  |NULL  |NULL  |L1    |700   |1     |110   |NULL  |NULL  |NULL  |NULL
1   |10  | NULL |NULL  |NULL  |NULL  |L2    |704   |3     |200   |NULL  |NULL  |NULL  |NULL
1   |10  | NULL |NULL  |NULL  |NULL  |L3    |407   |4     |100   |NULL  |NULL  |NULL  |NULL
1   |10  | NULL |NULL  |NULL  |NULL  |NULL  |NULL  |NULL  |NULL  |M1    |400   |2     |500
1   |20  | NULL |NULL  |NULL  |NULL  |L1    |708   |1     |100   |NULL  |NULL  |NULL  |NULL
2   |20  | NULL |NULL  |NULL  |NULL  |L1    |790   |1     |200   |NULL  |NULL  |NULL  |NULL
2   |20  | NULL |NULL  |NULL  |NULL  |NULL  |NULL  |NULL  |NULL  |M1    |490   |1     |100
.
.

如果我离开 join tssoc220,tssoc230, tssoc240 和 tssoc210(tssoc210 作为左表),它会复制该行。

left join tssoc220 ON  tssoc210.orno = tssoc220.orno and tssoc210.acln = tssoc220.acln
left join tssoc230 ON  tssoc210.orno = tssoc230.orno and tssoc210.acln = tssoc230.acln 
left join tssoc240 ON  tssoc210.orno = tssoc240.orno and tssoc210.acln = tssoc240.acln 

我哪里错了?

【问题讨论】:

  • 如果你在 orno 一个 acln 上加入这四个表,对于 orno=1,acln=10,你将得到 1 x 2 x 3 x 1 = 6 条记录。也许你也需要加入eqan。我真的不能说。这是一个需要了解表建模内容的问题。

标签: sql-server join parent-child multiple-tables


【解决方案1】:

您将需要编写 3 个查询,它们只连接 1 个表并将它们合并。

SELECT tssoc210.orno,tssoc210.acln,tssoc220.l_lino,tssoc220.l_invn,tssoc220.l_eqan,tssoc220.l_asto,NULL as m_lino,NULL as m_invn,NULL as m_eqan,NULL as m_asto,NULL as o_lino,NULL as o_invn,NULL as o_eqan,NULL as o_asto
FROM tssoc210 
left join tssoc220 ON  tssoc210.orno = tssoc220.orno and tssoc210.acln = tssoc220.acln
UNION ALL 
SELECT  tssoc210.orno,tssoc210.acln,NULL as l_lino,NULL as l_invn,NULL as l_eqan,NULL as l_asto,tssoc230.m_lino,tssoc230.m_invn,tssoc230.m_eqan,tssoc230.m_asto,NULL as o_lino,NULL as o_invn,NULL as o_eqan,NULL as o_asto
FROM tssoc210 
left join tssoc230 ON  tssoc210.orno = tssoc230.orno and tssoc210.acln = tssoc230.acln 
UNION ALL 
SELECT  tssoc210.orno,tssoc210.acln,NULL as l_lino,NULL as l_invn,NULL as l_eqan,NULL as l_asto,,NULL as m_lino,NULL as m_invn,NULL as m_eqan,NULL as m_asto,tssoc240.o_lino,tssoc240.o_invn,tssoc240.o_eqan,tssoc240.o_asto
FROM tssoc210 
left join tssoc240 ON  tssoc210.orno = tssoc240.orno and tssoc210.acln = tssoc240.acln 

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 2016-11-20
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    相关资源
    最近更新 更多