【发布时间】:2017-11-23 17:02:41
【问题描述】:
我想根据条件从表中删除重复的行。
例如, 表 ABC:
ID Name Pin Status
111 Pope 909 New
222 Jazz 909 New
333 Volk 767 Assigned
444 Audi 767 New
555 Pink 435 New
我想根据以下条件删除具有相同“Pin”的重复记录:
- 如果两个相同的 Pin 记录的状态为新建 – 删除其中任何一个。
- 如果相同 Pin 记录之一的状态为“新”,而另一个“已分配”状态 - 删除“新”状态记录。
我编写了以下 SQL,但我想知道是否有更好的方法来使用 PK 来处理这个问题。
对于 1:
DELETE FROM ABC WHERE ID IN (
SELECT
a.id
FROM ABC a
WHERE a.rowid <
(SELECT max(rowid)
FROM ABC b
WHERE b.pin = a.pin
AND a.status = b.status
AND b.status in ('New')
)
);
对于 2:
DELETE FROM ABC WHERE ID IN (
SELECT
a.id
FROM ABC a
WHERE a.rowid <
(SELECT max(rowid)
FROM ABC b
WHERE b.pin = a.pin
AND a.status <> b.status
AND a.status in ('New')
AND b.status in ('Assigned')
)
);
【问题讨论】:
-
如果一个 pin 有多个分配和多个新行怎么办?
-
如果两行都具有相同的引脚且两者均已分配状态 - 什么也不做。
标签: sql database oracle duplicates sql-delete