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

标签 sql-server sql-server-2008 null duplicates

在 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/

相关文章:

sql - 为什么 UDF 比子查询慢这么多?

sql-server - Azure/Powershell : Checking to see if a SQL Server exists

mysql - 如何在 SQL 中从 xml 中检索所有值

java - 双向链表

c# - LINQ 到 SQL : If database return no values Count() throws an exception

sql-server - 完整发票号码 + 逗号分隔的 SQL 列表 (TSQL)

sql - 更改 SQL Server 中架构绑定(bind) View 引用的列的大小

sql-server-2008 - 如何检查 SQL Server 版本

sql-server-2008 - 报告生成器3.0

javascript - 在没有原型(prototype)的情况下创建的对象上使用 console.log 时出错 && 访问具有字符串属性的数组有效..如何?