sql - 使用 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
解决方案
对您的数据库执行此操作违反了良好做法,因为它违反了 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
推荐阅读
- shell - 根据 shell 脚本中的参数将输出打印到控制台或文件中
- python - Python:如何在 Firefox 中自动化“允许”Flash 播放器内容?
- javascript - TypeError:当我使用 React Context API 时,渲染不是一个函数
- spring-boot - 无法在 Springboot 应用程序中执行 groovy 测试文件
- javascript - 使用可随时间变化的二维过滤器数组过滤数据数组
- python - 用 Python 启动 lpksetup.exe
- c# - 使用结构的 C++ 字符串到 C#
- node.js - mongoose $sort 不适用于聚合
- android - 如何使用共享首选项保存评分栏值?
- bash - 即使我指定了执行它的程序,我是否需要在脚本名称之前指定 ./(点斜杠)?