如何创建 UPDATE 语句来合并多个表中的重复项?

问题描述 投票:0回答:1

我想知道是否有人能够帮助我完成这个

UPDATE
声明

我有大约 300 条左右的客户记录,其中包括地址、检查记录、注释等数据,所有这些数据都分布在多个表中。例如,客户的记录将在一张桌子上,他们的检查记录在另一张桌子上,他们的注释在另一张桌子上等等。它们通过客户 ID 链接在一起。

所以这 300 条记录中是重复的(大约一半是重复的)。我想要完成的是一个

UPDATE
语句,它将重复记录的 ID 更改为原始记录的 ID。

然后有效地将所有其他表格(检查、注释)合并到客户的原始 ID 上。我想按顺序将其他表上的每个

CustomerID
更新为第一个 ID。因此,如果客户的第一条记录的 ID 为 1,并且其重复记录的 ID 为 2,我想将其他表上的所有 2 更新为 1。

希望下面的例子可以更好地说明这一点:

CUSTOMER
表:

客户ID 客户姓名
1 约翰·琼斯
2 约翰·琼斯
3 大卫·菲利普斯
4 大卫·菲利普斯

INSPECTION
表(更新前)

检验ID 客户ID
001 1
001 2
001 3
001 4

INSPECTION
表(更新后):

检验ID 客户ID
001 1
001 1
001 3
001 3

我正在努力解决的是如何让 SQL 将 ID 按顺序更新为第一个 ID。

sql sql-server duplicates window-functions
1个回答
0
投票

您可以使用

ROW_NUMBER
FIRST_VALUE
获取重复项。在这种情况下,
FIRST_VALUE
是最有意义的,因为您希望将数据从一个 ID 复制到另一个 ID。

PARTITION BY
子句包含您想要区分的列。确保
ORDER BY
是唯一的,例如使用主键。

WITH cte AS (
    SELECT *,
      FIRST_VALUE(c.CustomerID) OVER (PARTITION BY c.CustomerName ORDER BY c.CustomerID ROWS UNBOUNDED PRECEDING) AS FirstID
    FROM CUSTOMER c
)
SELECT *
FROM cte
WHERE cte.CustomerID <> cte.FirstID;

您可以将其与其他各种表格上的

UPDATE
结合起来,例如

WITH cte AS (
    SELECT *,
      FIRST_VALUE(c.CustomerID) OVER (PARTITION BY c.CustomerName ORDER BY c.CustomerID ROWS UNBOUNDED PRECEDING) AS FirstID
    FROM CUSTOMER c
)
UPDATE i
SET CustomerID = cte.FirstID
FROM cte
JOIN INSPECTION i ON i.CustomerID = cte.CustomerID
WHERE cte.CustomerID <> cte.FirstID;

最后删除多余的父行。

WITH cte AS (
    SELECT *,
      FIRST_VALUE(c.CustomerID) OVER (PARTITION BY c.CustomerName ORDER BY c.CustomerID ROWS UNBOUNDED PRECEDING) AS FirstID
    FROM CUSTOMER c
)
DELETE cte
WHERE cte.CustomerID <> cte.FirstID;
© www.soinside.com 2019 - 2024. All rights reserved.