根据另一列的值删除重复项

时间:2016-08-04 13:36:58

标签: sql-server sql-server-2014

我有一个包含3列的表,第一列是'name'。有些名字输入两次,有的是3次,有的则多一些。我想为每个名称只保留一个值,并根据第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     

非常感谢提前。

2 个答案:

答案 0 :(得分:0)

Delete from yourtable 
where column2 is null and column3 is null

以上查询是基于此..

  

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

答案 1 :(得分:0)

在名称上使用分区,并使用适当的顺序:

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

这将删除重复项,按优先顺序排列,行包含:

  1. column1和column2都不为null(如果有多个则保留随机)
  2. column1 not null
  3. column2 not null
  4. column1和column2都为null
  5. 请注意,查询假设(基于要提问的评论)您的" null"值实际上是文本字符串" null"而不是SQL null

    如果它们实际上为空,请将= 'null'替换为IS NULL