通过连接多个表在SQL Server中平整数据

问题描述 投票:0回答:1

我想展平父子表以进行数据分析。我有服务订单表tssoc210 as

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
.
.

如果我将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 

我要去哪里错了?

sql-server join parent-child multiple-tables
1个回答
0
投票

您将需要编写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 
© www.soinside.com 2019 - 2024. All rights reserved.