首页 > 解决方案 > 使用 XML PATH 使用表 A 中的多个行值更新表 B 中的列

问题描述

我在表 A 中有 4 列,即 Inv_Num1、Inv_Date1、Inv_Amt1、Inv_DocNum1

我在表 B 中有 4 列,即 Inv_Num2、Inv_Date2、Inv_Amt2、Inv_Status2

我想通过使用条件为的内部联接来匹配表 A 和表 B 之间的行

Invoice_Num1=Invoice_Num2  AND Invoice_Date1=Invoice_Date2  AND
Invoice_Amt1=Invoice_Amt2

当我进行此匹配时,我可能会在表中得到超过 1 行的结果

A (Invoice_DocNum1 column)

我尝试了 XML 路径代码,但我不知道如何在 Update 语句中实现

update cis2
set cis2.Inv_Status2 = 
(SELECT     
    TypeName = STUFF((
        SELECT '; ' + imd1.Inv_DocNum1
        FROM [VRS].[Table_B] cis1
        INNER JOIN [Table_A] imd1 
            ON cis1.Inv_Num1 = imd1.Inv_Num2
        WHERE cis1.Inv_Num1 = imd1.Inv_Num2
        AND cis1.Inv_Date1 = imd1.Inv_Date2
        AND cis1.Inv_Amt1 = imd1.Inv_Amt2

        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
) FROM  Table_B cis2

我已经解释了表 A 和表 B 的结构和预期输出

标签: sqlsql-serverfor-xml-path

解决方案


对您的数据库执行此操作违反了良好做法,因为它违反了 1NF。但是,如果您一心想要这样做,您仍然可以这样做。这些方面的东西应该起作用。

with myCte as
(
    SELECT Inv_Num1
        , TypeName = STUFF((
            SELECT '; ' + imd1.Inv_DocNum1
            FROM [VRS].[Table_B] cis1
            INNER JOIN [Table_A] imd1 
                ON cis1.Inv_Num1 = imd1.Inv_Num2
            WHERE cis1.Inv_Num1 = imd1.Inv_Num2
            AND cis1.Inv_Date1 = imd1.Inv_Date2
            AND cis1.Inv_Amt1 = imd1.Inv_Amt2
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
    from Table_A
    group by Inv_Num1
)

update tb
set Inv_Status2 = c.TypeName
from Table_B tb
join myCte c on c.Inv_Num1 = tb.Inv_Num2

推荐阅读