Sql server 基于另一列的值删除重复项
我有一个有3列的表,第一列是'name'。有些名字输入两次,有些是三次,有些甚至更多。我希望每个名称只保留一个值,并根据第2列和第3列的值删除额外的行。如果第2列和第3列为空,我想删除该行。 没有主键或id列。 表中大约有275万行。 希望使用SQL 14中的一个查询(最好)删除。有人能帮忙吗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
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
这将删除重复的行,并按优先顺序保留以下行:
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
这将删除重复的行,并按优先顺序保留以下行:
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'@游戏来打破关系的更多详细信息,请参见编辑后的答案,这是基于相关示例数据的逻辑。有关更多详细信息,请参见编辑的答案