我想知道是否有人能够帮助我完成这个
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。
您可以使用
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;