gpt4 book ai didi

sql-server - 删除重复项 ... 使用 NULL

转载 作者:行者123 更新时间:2023-12-04 04:57:50 24 4
gpt4 key购买 nike

在 MS SQL Server 中,我试图从具有空值的表中删除重复项。呻吟声。很多很多NULL s。底线是我需要保留任何重复记录的一份副本,无论是否有 NULL s。我基本上想要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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com