Sql server 基于另一列的值删除重复项

Sql server 基于另一列的值删除重复项,sql-server,sql-server-2014,Sql Server,Sql Server 2014,我有一个有3列的表,第一列是'name'。有些名字输入两次,有些是三次,有些甚至更多。我希望每个名称只保留一个值,并根据第2列和第3列的值删除额外的行。如果第2列和第3列为空,我想删除该行。 没有主键或id列。 表中大约有275万行。 希望使用SQL 14中的一个查询(最好)删除。有人能帮忙吗 Name column2 column3 Suzy english null Suzy null null Suzy null 5 John null

我有一个有3列的表,第一列是'name'。有些名字输入两次,有些是三次,有些甚至更多。我希望每个名称只保留一个值,并根据第2列和第3列的值删除额外的行。如果第2列和第3列为空,我想删除该行。 没有主键或id列。 表中大约有275万行。 希望使用SQL 14中的一个查询(最好)删除。有人能帮忙吗

Name    column2 column3
Suzy    english  null
Suzy    null    null
Suzy    null     5
John    null    null
John    7        7
George  null    benson
George  null    null
George  benson  null    
George  5       benson  
希望将其作为:

Name    column2 column3
Suzy    english  null   
Suzy    null     5  
John     7       7
George  benson   null
George  5        benson     
非常感谢

Delete from yourtable 
where column2 is null and column3 is null
以上查询基于此

我希望每个名称只保留一个值,并根据第2列和第3列的值删除额外的行。如果第2列和第3列为空,我想删除该行

以上查询基于此

我希望每个名称只保留一个值,并根据第2列和第3列的值删除额外的行。如果第2列和第3列为空,我想删除该行


按以下顺序在名称上使用分区:

WITH cte as (
  SELECT ROW_NUMBER()
    OVER (PARTITION BY name
          ORDER BY case
            when column1 = 'null' and column2 = 'null' then 3
            when column2 = 'null' then 2
            when column1 = 'null' then 1
            else 0 end
    ) num 
  FROM mytable
)
delete from cte where num > 1
这将删除重复的行,并按优先顺序保留以下行:

  • column1和column2都不为空(如果有多个,则保留随机一个)
  • 第1列不为空
  • 第2列不为空
  • column1和column2都为空
  • 注意,is查询假设(基于对问题的注释)您的“null”值实际上是文本字符串“null”,而不是SQL
    null


    如果它们实际上是空的,则将
    ='null'
    替换为
    是空的

    按适当的顺序在名称上使用分区,方法是:

    WITH cte as (
      SELECT ROW_NUMBER()
        OVER (PARTITION BY name
              ORDER BY case
                when column1 = 'null' and column2 = 'null' then 3
                when column2 = 'null' then 2
                when column1 = 'null' then 1
                else 0 end
        ) num 
      FROM mytable
    )
    delete from cte where num > 1
    
    这将删除重复的行,并按优先顺序保留以下行:

  • column1和column2都不为空(如果有多个,则保留随机一个)
  • 第1列不为空
  • 第2列不为空
  • column1和column2都为空
  • 注意,is查询假设(基于对问题的注释)您的“null”值实际上是文本字符串“null”,而不是SQL
    null



    如果它们实际上是空的,那么将
    ='null'
    替换为
    是空的

    难道不会再有一行吗?一行为
    George,benson,null
    ,另一行为
    George,null,benson
    ,再加上最后一行为
    5,benson
    。您还可以考虑控制数据添加到表中的方式,这样您就不必首先进行清理了?难道不会再有一行George吗?一行为
    George,benson,null
    ,另一行为
    George,null,benson
    ,再加上最后一行为
    5,benson
    。您还可以考虑控制数据添加到表中的方式,这样您就不必首先进行清理了?谢谢,但问题是,如果我对mytable中的Select*执行一次搜索,其中column2为null,column3为null,则不会得到任何结果。但是如果我从mytable中选择*,我可以看到2个空列!!不知道如何解决问题是那些实际的
    NULL
    s还是字符串“NULL”?它们是完全不同的如果一个名称的唯一一行的其他列为空怎么办?我怎么知道?据我所知,它是空的。没有创建表。它已经存在很长一段时间了。@Suzy:要找到它,只需使用select*from table,其中column2='null'和column3='null'谢谢,但有一个小问题,如果我从我的表中选择select*,其中column2为null,column3为null,它将一无所获。但是如果我从mytable中选择*,我可以看到2个空列!!不知道如何解决问题是那些实际的
    NULL
    s还是字符串“NULL”?它们是完全不同的如果一个名称的唯一一行的其他列为空怎么办?我怎么知道?据我所知,它是空的。没有创建表。它已经存在很长一段时间了。@Suzy:要找到它,只需使用select*从表中选择column2='null'和column3='null'为什么我们需要column2='null',column1='null'@游戏来打破僵局,逻辑基于所讨论的示例数据。有关为什么我们需要column2='null',column1='null'@游戏来打破关系的更多详细信息,请参见编辑后的答案,这是基于相关示例数据的逻辑。有关更多详细信息,请参见编辑的答案