在 MS SQL Server 中,我尝试从包含空值的表中删除重复项。却传来呻吟声。很多很多NULL
。最重要的是,我需要保留带有或不带有 NULL 的任何重复记录的一份副本。我基本上希望NULL
在操作期间表现得像一个值为“NULL
”的普通记录,然后返回到真正的NULL
。这可能吗?有没有更简单的解决方案?
Table1
如下所示:
UID Data1 Data2
1 A NULL
2 A NULL
3 B abc
4 B abc
5 C NULL
6 D ghj
我希望命令丢弃第 2 行和第 4 行并保留其余部分。 (SELECT 用于测试。)
;SELECT UID, Data1, Data2
FROM Table1 AS T
WHERE NOT EXISTS (
SELECT 1
FROM table1 AS T2
WHERE
T2.Data1 = T.Data1
AND T2.Data2 = T.Data2
AND T2.UID >= T.UID
)
AND Data1 IS NOT NULL
注意:SELECT DISTINCT 将不起作用,因为重复项具有不同的时间戳。
最佳答案
这应该做:
;WITH CTE AS
(
SELECT *,
RN = ROW_NUMBER() OVER(PARTITION BY Data1,Data2 ORDER BY UID)
FROM table1
)
DELETE
--SELECT *
FROM CTE
WHERE RN > 1
更新了以下评论
好的,如果您在删除这么多行时遇到问题,那么您可以尝试使用要删除的 ID 创建一个查找表,然后执行批量删除(您将不过,必须测试批处理行数)。这是一个想法(假设UID
是一个pk):
;WITH CTE AS
(
SELECT *,
RN = ROW_NUMBER() OVER(PARTITION BY Data1,Data2 ORDER BY UID)
FROM table1
)
SELECT [UID]
INTO RowsToDelete
FROM CTE
WHERE RN > 1;
CREATE INDEX I_UID ON RowsToDelete([UID]);
WHILE 1=1
BEGIN
DELETE TOP (10000)
FROM table1 T
INNER JOIN RowsToDelete L
ON T.[UID] = L.[UID]
IF @@ROWCOUNT < 10000 BREAK;
END
关于sql-server - 删除重复项...使用 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16546537/