删除同一表SQL中不同类别中的重复值但保留第一个类别值
Posted
技术标签:
【中文标题】删除同一表SQL中不同类别中的重复值但保留第一个类别值【英文标题】:Remove duplicate value in different categories in same table SQL but keep the first category value 【发布时间】:2021-11-03 06:32:18 【问题描述】:假设我有一个表,其 id 和类别如下表所示
D_id | D_category
-----------------
1 | A
2 | A
3 | A
1 | B
2 | B
4 | B
5 | B
1 | C
2 | C
4 | C
5 | C
6 | C
所以规则是这样的
A 类的值不应出现在 B 类和 C 类中 B 类中的值不应出现在 C 类中最终的结果应该是这样的
D_id | D_category
-----------------
1 | A
2 | A
3 | A
4 | B
5 | B
6 | C
我将提供一个可行的解决方案,但它不是一个理想的解决方案,如果有更多类别,任何人都可以帮助我提供更好的解决方案,这意味着如果有更多类别,那么它应该遵循之前类别中的值应该遵循的规则没有出现在任何其他类别中
DECLARE @A TABLE(
D_id INT NOT NULL,
D_category VARCHAR(MAX));
INSERT INTO @A(D_id,D_category)
VALUES (1, 'A'),
(2, 'A'),
(3, 'A'),
(1, 'B'),
(2, 'B'),
(4, 'B'),
(5, 'B'),
(1, 'C'),
(2, 'C'),
(4, 'C'),
(5, 'C'),
(6, 'C')
DELETE t
FROM @A t
WHERE t.D_category = 'B' AND EXISTS (SELECT 1 FROM @A t2 WHERE t2.D_category = 'A' and t.D_id = t2.D_id)
DELETE t
FROM @A t
WHERE t.D_category = 'C' AND EXISTS (SELECT 1 FROM @A t2 WHERE t2.D_category = 'B' and t.D_id = t2.D_id)
DELETE t
FROM @A t
WHERE t.D_category = 'C' AND EXISTS (SELECT 1 FROM @A t2 WHERE t2.D_category = 'A' and t.D_id = t2.D_id)
select * from @A
【问题讨论】:
为什么之前删除了这个问题,然后在另一个帐户下重新提问?我本来正要回答的。拥有多个帐户违反了条款和条件。 【参考方案1】:只需检查指定的记录在序列的前面是否不存在。
select *
from @A A1
where not exists (
select 1
from @A A2
where A2.D_id = A1.D_id
and A2.D_category < A1.D_category
)
【讨论】:
【参考方案2】:或者只是使用row_number()
select *
from
(
select *, r = row_number() over (partition by D_id order by D_category)
from @A
) a
where a.r = 1
【讨论】:
【参考方案3】:使用连接语法删除:
delete a
from my_table a
join my_table b on a.D_id = b.D_id
and a.D_category > b.D_category
见live demo。
【讨论】:
以上是关于删除同一表SQL中不同类别中的重复值但保留第一个类别值的主要内容,如果未能解决你的问题,请参考以下文章