Sql 用于删除和显示重复记录的单个查询
采访中提出的一个问题是 一个表有100条记录。其中50个 都是重复的。有没有可能用单人床 查询以删除重复记录 从表中选择并 显示剩余的50条记录 这在单个SQL查询中是否可能 谢谢Sql 用于删除和显示重复记录的单个查询,sql,sql-server,duplicate-removal,Sql,Sql Server,Duplicate Removal,采访中提出的一个问题是 一个表有100条记录。其中50个 都是重复的。有没有可能用单人床 查询以删除重复记录 从表中选择并 显示剩余的50条记录 这在单个SQL查询中是否可能 谢谢 SNA听起来不太可能,至少在ANSI SQL中是这样,因为delete只返回已删除行数的计数。对于SQL Server,您可以使用类似的方法 DECLARE @Table TABLE (ID INTEGER, PossibleDuplicate INTEGER) INSERT INTO @Table VALUES
SNA听起来不太可能,至少在ANSI SQL中是这样,因为delete只返回已删除行数的计数。对于SQL Server,您可以使用类似的方法
DECLARE @Table TABLE (ID INTEGER, PossibleDuplicate INTEGER)
INSERT INTO @Table VALUES (1, 100)
INSERT INTO @Table VALUES (2, 100)
INSERT INTO @Table VALUES (3, 200)
INSERT INTO @Table VALUES (4, 200)
DELETE FROM @Table
OUTPUT Deleted.*
FROM @Table t
INNER JOIN (
SELECT ID = MAX(ID)
FROM @Table
GROUP BY PossibleDuplicate
HAVING COUNT(*) > 1
) d ON d.ID = t.ID
该语句显示已删除的记录
更新:
上述查询将删除重复项,并为您提供已删除的行,而不是保留的行。如果这对您很重要(总的来说,剩余的50行应该与删除的50行相同),您可以使用语法来实现这一点。很好地解释了如何输出删除的行。我想补充两点:
输出指定为@Tbl
(其中@Tbl
是您在删除之前声明的表变量)MAX
、MIN
或任何其他聚合,每个组只能处理一个重复行。如果您可能有许多重复项,以下SQL Server 2005+代码将有助于做到这一点:您为什么希望/需要这样做?这可能取决于数据库引擎,但对于SQL Server,这是完全可能的。Oracle、Microsoft SQL Server、mysql或其他?请举例说明另一个糟糕的面试问题。我喜欢你清楚地展示了如何做,而你的代表4次和10次的人都说这是不可能的。只是表明没有人是(onmiscient)(omsincent)(omniccent)。。。什么都知道。+1哇,我今天已经学了新东西,现在还是早上。:)非常感谢。这非常有用。如果表中不存在唯一标识符(示例中的ID列)列,我们该如何做???
;WITH Duplicates AS
(
SELECT
ID,
ROW_NUMBER() OVER (PARTITION BY DupeColumn ORDER BY ID) AS RowNum
)
DELETE FROM MyTable
OUTPUT deleted.*
WHERE ID IN
(
SELECT ID
FROM Duplicates
WHERE RowNum > 1
)