来自 SQL 服务器中 LEFT JOIN 的动态列
Dynamic columns from a LEFT JOIN in SQL Server
我有一个问题,希望您能指导我,我在 sql 服务器中有 3 个 table 具有以下特征:
Table 发票
ID Folio
------------------
1 101010
2 202020
Table 额外
ID Name
--------------------------
1 Order Number
2 Branch
Table 额外发票:
ID_INVOICE ID_ADDITIONAL VALUE
------------------------------------------------------------
1 1 1234/1
1 2 NORTH
2 1 5678/9
2 2 SOUTH
table 3 依赖于 table 1 和 2 并且比例为一对多,我寻找以下结果:
查询结果
ID Folio Order Number Branch
------------------------------------------------------------
1 101010 1234/1 NORTH
2 202020 5678/9 SOUTH
调查我可以使用 PIVOT 或 CROSS APPLY,但我发现自己有点迷茫 :( 或者有人有其他解决方案动态列的问题?
虽然这可以通过 PIVOT
and/or CROSS APPLY
来完成,但我只会使用条件聚合,这是一种高效的跨数据库解决方案:
select
i.id,
i.folio,
max(case when a.name = 'Order Number' then ai.value end) OrderNumber,
max(case when a.name = 'Branch' then ai.value end) Branch
from Invoice i
inner join AdditionalInvoice ai on ai.id_invoice = i.id
inner join Additional a on a.id = ai.id_additional
group by i.id, i.folio
注意:重读你的问题我注意到最后提到了 dynamic 列。
请注意,上述查询(或任何其他纯 sql 解决方案,包括 PIVOT
和 CROSS APPLY
)仅适用于 fixed 列集。这是因为纯 SQL 查询只能返回一组预定义的固定列。如果你想要一个动态的解决方案,那么你需要 dynamic SQL (即:准备一个查询字符串,然后执行它)。
另一方面,通过添加 max(case when ... then ... end)
表达式,可以轻松扩展上述语句以处理来自 additional
table 的更多值。
我有一个问题,希望您能指导我,我在 sql 服务器中有 3 个 table 具有以下特征:
Table 发票
ID Folio
------------------
1 101010
2 202020
Table 额外
ID Name
--------------------------
1 Order Number
2 Branch
Table 额外发票:
ID_INVOICE ID_ADDITIONAL VALUE
------------------------------------------------------------
1 1 1234/1
1 2 NORTH
2 1 5678/9
2 2 SOUTH
table 3 依赖于 table 1 和 2 并且比例为一对多,我寻找以下结果:
查询结果
ID Folio Order Number Branch
------------------------------------------------------------
1 101010 1234/1 NORTH
2 202020 5678/9 SOUTH
调查我可以使用 PIVOT 或 CROSS APPLY,但我发现自己有点迷茫 :( 或者有人有其他解决方案动态列的问题?
虽然这可以通过 PIVOT
and/or CROSS APPLY
来完成,但我只会使用条件聚合,这是一种高效的跨数据库解决方案:
select
i.id,
i.folio,
max(case when a.name = 'Order Number' then ai.value end) OrderNumber,
max(case when a.name = 'Branch' then ai.value end) Branch
from Invoice i
inner join AdditionalInvoice ai on ai.id_invoice = i.id
inner join Additional a on a.id = ai.id_additional
group by i.id, i.folio
注意:重读你的问题我注意到最后提到了 dynamic 列。
请注意,上述查询(或任何其他纯 sql 解决方案,包括 PIVOT
和 CROSS APPLY
)仅适用于 fixed 列集。这是因为纯 SQL 查询只能返回一组预定义的固定列。如果你想要一个动态的解决方案,那么你需要 dynamic SQL (即:准备一个查询字符串,然后执行它)。
另一方面,通过添加 max(case when ... then ... end)
表达式,可以轻松扩展上述语句以处理来自 additional
table 的更多值。