更新其中有重复的列
UPDATE where have duplicated colums
我想知道如何更新重复列的值。
例子我有这个
ColumnA
ColumnB
ColumnC
Repeated?
NAMEA
111
1234
No
NAMEC
222
5678
No
NAMEB
222
5678
No
我需要将列(重复?)更改为 YES WHERE ColumnB 和 ColumnC 等于,如下所示:
ColumnA
ColumnB
ColumnC
Repeated?
NAMEA
111
1234
No
NAMEC
222
5678
Yes
NAMEB
222
5678
Yes
我试过了
UPDATE [MY_TABLE]
SET [Repeated?] = 'Yes'
FROM [MY_TABLE] as A
INNER JOIN
(
SELECT ColumnA, ColumnC
FROM [MY_TABLE]
GROUP BY ColumnA, ColumnC
) as B
ON B.ColumnC = A.ColumnC, B.ColumnA = B.ColumnA
但这没有用。有人可以帮忙吗?
我认为这应该可以解决问题
UPDATE yt1
SET Repeated= (CASE WHEN yt2.ColumnA IS NULL THEN 'No' ELSE 'Yes' END)
FROM YourTable yt1
LEFT OUTER JOIN YourTable yt2
ON yt1.ColumnB = yt2.ColumnB AND yt1.ColumnC = yt2.ColumnC
WHERE yt1.ColumnA <> yt2.ColumnA
您的解决方案实际上比您接受的解决方案更好(一旦您更正了错误)。因为 INNER JOIN
意味着您不会更新除需要更改为 'Yes' 的行以外的任何行,而您接受的答案会更新 ALL 中的行 tableun-necessarily。您遇到的问题是
- 您使用
AND
而非 ,
组合连接条件。
- 您的第二个连接条件是将同一列与其自身进行比较。
- 你的第二个连接条件应该是 ColumnB 而不是 ColumnA
- 您不需要 sub-query 来加入 table 本身。
- 但最重要的是您没有添加条件来防止行连接到自身。
UPDATE A
SET [Repeated?] = 'Yes'
FROM [MY_TABLE] AS A
INNER JOIN [MY_TABLE] AS B
ON B.ColumnC = A.ColumnC
AND B.ColumnB = A.ColumnB
-- The next condition prevents a row matching itself
AND B.ColumnA <> A.ColumnA;
备注:
- 使用
FROM
更新 table 时,您 UPDATE
别名不是 table 名称。
- 最佳做法是不要使用需要转义的字符来命名列,例如
[Repeated?]
只需使用 Repeated
(或者我会使用 IsRepeated
)。
- 您最好在需要时查询它,而不是每次更改时都必须更新 table。
我想知道如何更新重复列的值。
例子我有这个
ColumnA | ColumnB | ColumnC | Repeated? |
---|---|---|---|
NAMEA | 111 | 1234 | No |
NAMEC | 222 | 5678 | No |
NAMEB | 222 | 5678 | No |
我需要将列(重复?)更改为 YES WHERE ColumnB 和 ColumnC 等于,如下所示:
ColumnA | ColumnB | ColumnC | Repeated? |
---|---|---|---|
NAMEA | 111 | 1234 | No |
NAMEC | 222 | 5678 | Yes |
NAMEB | 222 | 5678 | Yes |
我试过了
UPDATE [MY_TABLE]
SET [Repeated?] = 'Yes'
FROM [MY_TABLE] as A
INNER JOIN
(
SELECT ColumnA, ColumnC
FROM [MY_TABLE]
GROUP BY ColumnA, ColumnC
) as B
ON B.ColumnC = A.ColumnC, B.ColumnA = B.ColumnA
但这没有用。有人可以帮忙吗?
我认为这应该可以解决问题
UPDATE yt1
SET Repeated= (CASE WHEN yt2.ColumnA IS NULL THEN 'No' ELSE 'Yes' END)
FROM YourTable yt1
LEFT OUTER JOIN YourTable yt2
ON yt1.ColumnB = yt2.ColumnB AND yt1.ColumnC = yt2.ColumnC
WHERE yt1.ColumnA <> yt2.ColumnA
您的解决方案实际上比您接受的解决方案更好(一旦您更正了错误)。因为 INNER JOIN
意味着您不会更新除需要更改为 'Yes' 的行以外的任何行,而您接受的答案会更新 ALL 中的行 tableun-necessarily。您遇到的问题是
- 您使用
AND
而非,
组合连接条件。 - 您的第二个连接条件是将同一列与其自身进行比较。
- 你的第二个连接条件应该是 ColumnB 而不是 ColumnA
- 您不需要 sub-query 来加入 table 本身。
- 但最重要的是您没有添加条件来防止行连接到自身。
UPDATE A
SET [Repeated?] = 'Yes'
FROM [MY_TABLE] AS A
INNER JOIN [MY_TABLE] AS B
ON B.ColumnC = A.ColumnC
AND B.ColumnB = A.ColumnB
-- The next condition prevents a row matching itself
AND B.ColumnA <> A.ColumnA;
备注:
- 使用
FROM
更新 table 时,您UPDATE
别名不是 table 名称。 - 最佳做法是不要使用需要转义的字符来命名列,例如
[Repeated?]
只需使用Repeated
(或者我会使用IsRepeated
)。 - 您最好在需要时查询它,而不是每次更改时都必须更新 table。