我有一个包含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
非常感谢提前。
答案 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
这将删除重复项,按优先顺序排列,行包含:
请注意,查询假设(基于要提问的评论)您的" null"值实际上是文本字符串" null"而不是SQL null
。
如果它们实际上为空,请将= 'null'
替换为IS NULL
。