首页 > 解决方案 > 在 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(目标),如下所示:

这是我尝试过的:

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) 而从不看着第二排。

我该如何解决这个问题?我目前的方法是完全错误的方法吗?

标签: sqlsql-server

解决方案


这是行不通的。首先,强烈建议不要将值存储在逗号分隔的列表中。但如果你必须这样做,你需要先聚合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

推荐阅读