Sql server 有没有办法从SQL Server中的表中删除重复项?

Sql server 有没有办法从SQL Server中的表中删除重复项?,sql-server,Sql Server,我有一张这样的桌子: 如您所见,第2行和第3行是相似的,第3行是一个无用的副本。我的问题是如何只删除第3行,而同时保留第2行和第4行 像这样: 谢谢你的帮助 您没有重复项。如果有一个具有相同记录的堆表,那么一个或多个记录中的每个值都是相同的。处理此问题的一种方法是添加标识列。然后,可以使用identity列删除部分但不是全部重复项 在您的情况下,如果存在另一条类似的记录,并且可能具有“更好”的数据,则需要删除该记录。可以使用EXISTS子句来执行此操作。下面的逻辑不是你想要的,但它应该让你知

我有一张这样的桌子:

如您所见,第2行和第3行是相似的,第3行是一个无用的副本。我的问题是如何只删除第3行,而同时保留第2行和第4行

像这样:


谢谢你的帮助

您没有重复项。如果有一个具有相同记录的堆表,那么一个或多个记录中的每个值都是相同的。处理此问题的一种方法是添加标识列。然后,可以使用identity列删除部分但不是全部重复项

在您的情况下,如果存在另一条类似的记录,并且可能具有“更好”的数据,则需要删除该记录。可以使用EXISTS子句来执行此操作。下面的逻辑不是你想要的,但它应该让你知道如何处理这个问题

DELETE t
FROM MyTable t
WHERE t.BCT IS NULL -- delete only records with no values?  
    AND t.BCS IS NULL 
    AND EXISTS( -- another record with a value exists, so this one might not be needed?
        SELECT * 
        FROM MyTable x
        WHERE (x.BCT IS NOT NULL OR t.BCS IS NOT NULL)
            AND x.portCode = t.portCode 
            AND x.effDate = t.effDate
            AND LEFT(x.issueName, 26) = LEFT(t.issueName, 26)
        )

如果E2与E3交换,那么哪一行是“无用的重复”?“复制”的定义必须非常正式,因为有些解决方案构成业务密钥,有些是属性,似乎您希望保留包含非空数据的行,而不是其他行。这里的定义是:“如果
portCode
effectiveDate
issuecaname
列相同,则这些行中只有具有非空基准列的记录”?“第3行是无用的副本。”。“然而,最后两列的值不同,因此根据定义,它不是重复的。定义最上面一行的是要删除的那一行,而不是最下面的那一行?顺便说一下,Kenny,你的真实姓名显示在这些截图的右上角;如果你介意的话(我想你可能会介意,因为这里使用了笔名)。@JNevil你说得对