sql - 在 SQL Server 中,如何从另一个表更新表?
问题描述
这是我的两张表:
Table1
+-----------+-----------+-------+-------+----------+
| Address1 | Address2 | Unit1 | Unit2 | Precinct |
+-----------+-----------+-------+-------+----------+
| 150 | Oak St | 0 | 10 | 1111 |
+-----------+-----------+-------+-------+----------+
Table2
+-----------+-----------+-------+-------+----------+
| Address1 | Address2 | Unit1 | Unit2 | Precinct |
+-----------+-----------+-------+-------+----------+
| 150 | Oak St | 0 | 10 | 1111 |
| 150 | Oak St | 0 | 10 | 2222 |
+-----------+-----------+-------+-------+----------+
我想要做的是将日期从 Table2(源)复制到 Table1(目标),如下所示:
- 匹配地址 1、地址 2、单元 1、单元 2
- 如果辖区相同,则不要做任何事情
- 如果 precinct 不同,请附加逗号(“1111”到“1111, 2222”)
这是我尝试过的:
UPDATE t1
SET t1.Precinct =
CASE
WHEN t1.Precinct LIKE '%' + t2.Precinct + '%' THEN t1.Precinct
ELSE t1.Precinct + ',' + t2.Precinct
END
FROM Table1 t1 join Table2 t2 on t1.Address1 = t2.Address1 and t1.Address2 = t2.Address2 and t1.Unit1 = t2.Unit1 and t1.Unit2 = t2.Unit2
我的预期结果是这样的:
Expected Result (Table1)
+-----------+-----------+-------+-------+-----------+
| Address1 | Address2 | Unit1 | Unit2 | Precinct |
+-----------+-----------+-------+-------+-----------+
| 150 | Oak St | 0 | 10 | 1111,2222 |
+-----------+-----------+-------+-------+-----------+
但我得到的是:
Actual Result (Table1) (Nothing changes)
+-----------+-----------+-------+-------+-----------+
| Address1 | Address2 | Unit1 | Unit2 | Precinct |
+-----------+-----------+-------+-------+-----------+
| 150 | Oak St | 0 | 10 | 1111 |
+-----------+-----------+-------+-------+-----------+
我玩了一下,发现由于 (address1, address2, unit1, unit2) 上的匹配在 Source 表中有 2 个结果,因此查询最终只查看第一行 (precinct=1111) 而从不看着第二排。
我该如何解决这个问题?我目前的方法是完全错误的方法吗?
解决方案
这是行不通的。首先,强烈建议不要将值存储在逗号分隔的列表中。但如果你必须这样做,你需要先聚合table2
。一个update
行只更新一次。
所以:
UPDATE t1
SET t1.Precinct = t1.Precinct + ',' + t2.Precincts
FROM Table1 t1 JOIN
(SELECT address1, address2, unit1, unit2,
STRING_AGG(Precinct, ',') as precincts
FROM Table2 t2
WHERE NOT EXISTS (SELECT 1
FROM table1 t1
WHERE t1.Address1 = t2.Address1 AND
t1.Address2 = t2.Address2 AND
t1.Unit1 = t2.Unit1 AND
t1.Unit2 = t2.Unit2 AND
',' + t1.precinct + ',' LIKE '%,' + t2.precinct + ',%'
)
GROUP BY address1, address2, unit1, unit2
) t2
ON t1.Address1 = t2.Address1 AND
t1.Address2 = t2.Address2 AND
t1.Unit1 = t2.Unit1 AND
t1.Unit2 = t2.Unit2
推荐阅读
- r - Markdown 在第一个 Chunk 后未编译(到达 html 抓取时停止)
- python - 如何在 django 中编写带有分页的单元测试
- node.js - amqp client doesn't show that RabbitMQ server connection is blocked
- reactjs - Material UI 主题全局 Dense 设置
- azure-data-factory - 在数据工厂中参数化多个 CSV 文件的负载的最佳实践
- google-apps-script - GmailApp(Google Apps 脚本)将内联图像显示为附件
- python - 修改绘图轴,使其刻度标签的顺序和它们各自的点相应改变 - 不修改数据本身
- apache-nifi - 在目标表中使用具有不同列名的 PutDatabaseRecord 迁移表
- asp.net - xamarin 表单中的登录概念
- javascript - 我如何设置状态?