Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用于删除和显示重复记录的单个查询_Sql_Sql Server_Duplicate Removal - Fatal编程技术网

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

采访中提出的一个问题是

一个表有100条记录。其中50个 都是重复的。有没有可能用单人床 查询以删除重复记录 从表中选择并 显示剩余的50条记录

这在单个SQL查询中是否可能

谢谢


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
    )