如何使用Row_num,Distinct,Groupby或不使用来删除重复项

时间:2018-08-02 07:48:53

标签: sql sql-server

我有这样的样本数据,它们仅具有varchar值,并且没有ID列:

Name 
Mohan
Mohan
Mohan
Mohan

必填输出:

Name
Mohan

如何仅通过相关子查询来实现。
我已经尝试过以下查询:

DELETE table  
WHERE name < ( SELECT MAX(name) FROM table t
WHERE t.name = name  )

3 个答案:

答案 0 :(得分:3)

也许您可以使用undocumented(!)%%physloc%%伪列(它描述了行的物理位置)来标识行。例如,仅使行具有最小的%%physloc%%

DELETE FROM elbat
            WHERE %%physloc%% <> (SELECT min(%%physloc%%)
                                         FROM elbat t
                                         WHERE t.name = elbat.name);

db<>fiddle

但是,正如已经提到的,%%physloc%%没有记录在案,因此在将来的补丁程序或发行版中,如有更改或删除,恕不另行通知。您的查询可能会突然中断。

答案 1 :(得分:1)

如果没有“ CTE,ROW_NUM,不同,分组,具有count(*)”,则可以使用UNION:

DECLARE @Data TABLE (Value varchar(50));
INSERT INTO @Data VALUES ('Name'), ('Mohan'), ('Mohan'), ('Mohan'), ('Mohan');

SELECT Value FROM @Data
UNION
SELECT Value FROM @Data

答案 2 :(得分:1)

除了使用%%physloc%%的粘滞位解决方案之外,当表没有主键时,我看不到通过相关子查询来实现此目的的方法。

但是这是一个附带子查询的替代方法。

DELETE t FROM 
(
  select row_number() over (partition by name order by name) as rn 
  from [Table]
) t
WHERE rn > 1;