SQL Server中左联接的动态列

SQL Server中左联接的动态列,sql,sql-server,database,pivot-table,cross-apply,Sql,Sql Server,Database,Pivot Table,Cross Apply,我有一个问题,希望您能指导我,我在sql server中有3个表,具有以下特点: 表发票 ID Folio ------------------ 1 101010 2 202020 表附加 ID Name -------------------------- 1 Order Number 2 Branch 表附加发票: ID_INVOICE ID_ADDIT

我有一个问题,希望您能指导我,我在sql server中有3个表,具有以下特点:

发票

ID         Folio
------------------
1          101010
2          202020
附加

ID           Name
--------------------------
1            Order Number
2            Branch
附加发票

ID_INVOICE           ID_ADDITIONAL          VALUE
------------------------------------------------------------
1                    1                      1234/1
1                    2                      NORTH
2                    1                      5678/9
2                    2                      SOUTH
表3取决于表1和表2,比率为一比多,我期待以下结果:

查询结果

ID          Folio          Order Number          Branch
------------------------------------------------------------
1           101010         1234/1                NORTH
2           202020         5678/9                SOUTH

我可以使用透视交叉应用,但我发现自己有点迷路了:(或者对动态列问题有其他解决方案的人?

虽然这可以通过
PIVOT
和/或
交叉应用来实现,但我只想使用条件聚合,这是一种高效的跨数据库解决方案:

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
注意:重读你的问题,我注意到最后提到了动态列

请注意,上述查询(或任何其他纯sql解决方案,
PIVOT
CROSS-APPLY
包括在内)仅适用于固定列集。这是因为纯sql查询只能返回预定义的固定列集。如果您想要动态解决方案,则需要动态sql(即:准备一个查询字符串,然后执行它)


另一方面,通过添加
max(case when…then…end),可以很容易地扩展上述语句,以处理
附加
表中的更多值
表达式。

虽然这可以通过
PIVOT
和/或
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
注意:重读你的问题,我注意到最后提到了动态列

请注意,上述查询(或任何其他纯sql解决方案,
PIVOT
CROSS-APPLY
包括在内)仅适用于固定列集。这是因为纯sql查询只能返回预定义的固定列集。如果您想要动态解决方案,则需要动态sql(即:准备一个查询字符串,然后执行它)


另一方面,通过添加
max(case when…then…end),可以很容易地扩展上述语句,以处理
附加
表中的更多值
expressions.

非常感谢您的回复,我的朋友,就咨询时间的影响而言,哪一个是最好的选择支点、交叉应用还是您提到的解决方案?@Edeveloper:我不希望不同选项之间有真正的性能差异。条件聚合可能会稍微好一点,但是应该通过测试对您的真实数据进行评估。优秀的朋友,您可以用您的解决方案解决问题,我非常感谢您的帮助。欢迎@Edeveloper!如果我的答案正确回答了您的问题,请单击复选标记…谢谢!非常感谢您的回答,我的朋友,以及对Consult的影响重复次数,哪一个是最好的选择,交叉应用还是您提到的解决方案?@Edeveloper:我不希望不同选项之间有实际的性能差异。条件聚合的性能可能稍好一些,但这应该通过对实际数据的测试来评估。非常好的朋友,您可以用您的解决方案,我非常感谢您的帮助。欢迎@Edeveloper!如果我的答案正确回答了您的问题,请单击复选标记…谢谢!