我有这样的样本数据,它们仅具有varchar
值,并且没有ID列:
Name
Mohan
Mohan
Mohan
Mohan
必填输出:
Name
Mohan
如何仅通过相关子查询来实现。
我已经尝试过以下查询:
DELETE table
WHERE name < ( SELECT MAX(name) FROM table t
WHERE t.name = name )
答案 0 :(得分:3)
也许您可以使用undocumented(!)%%physloc%%
伪列(它描述了行的物理位置)来标识行。例如,仅使行具有最小的%%physloc%%
。
DELETE FROM elbat
WHERE %%physloc%% <> (SELECT min(%%physloc%%)
FROM elbat t
WHERE t.name = elbat.name);
但是,正如已经提到的,%%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;