来自 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

调查我可以使用 PIVOTCROSS 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 解决方案,包括 PIVOTCROSS APPLY)仅适用于 fixed 列集。这是因为纯 SQL 查询只能返回一组预定义的固定列。如果你想要一个动态的解决方案,那么你需要 dynamic SQL (即:准备一个查询字符串,然后执行它)。

另一方面,通过添加 max(case when ... then ... end) 表达式,可以轻松扩展上述语句以处理来自 additional table 的更多值。