我有这样的数据库(示例(
client_id | 照片类型 | 日期||
---|---|---|---|
1 | 许可证 | 13.10.2022||
1 | ident | 2022年10月12日||
2 | ident | 15.10.2022[/tr>||
2 | 许可证 | 2022年10月14日 | |
3 | 许可证 | 15.10.2022 | |
4 | 识别 | 16.10.2022[/tr>
DELETE
是一个成本高昂的操作,尤其是对于大型数据集。相反,使用CcreateTableAS语句可能更适合快速管理相同的问题,如
CREATE TABLE t1 AS
SELECT client_id, photo_type, "date"
FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY client_id ORDER BY "date" DESC) AS rn
FROM t)
WHERE rn = 1
其中查询对于每个CCD_ 2仅挑选单行,即使对于CCD_。
演示
这里有一个选项:为要删除的行查找rowid,然后。。。好吧,删除他们:
样本数据:
SQL> SELECT *
2 FROM test
3 ORDER BY client_id, datum;
CLIENT_ID PHOTO_T DATUM
---------- ------- ----------
1 ident 12.10.2022
1 license 13.10.2022
2 license 14.10.2022
2 ident 15.10.2022
3 license 15.10.2022
4 ident 16.10.2022
6 rows selected.
删除:
SQL> DELETE FROM
2 test a
3 WHERE a.ROWID IN
4 (SELECT x.rid
5 FROM (SELECT ROWID rid,
6 b.client_id,
7 ROW_NUMBER ()
8 OVER (PARTITION BY b.client_id
9 ORDER BY b.datum DESC) rn
10 FROM test b) x
11 WHERE x.client_id = a.client_id
12 AND x.rn > 1);
2 rows deleted.
结果:
SQL> SELECT *
2 FROM test
3 ORDER BY client_id, datum;
CLIENT_ID PHOTO_T DATUM
---------- ------- ----------
1 license 13.10.2022
2 ident 15.10.2022
3 license 15.10.2022
4 ident 16.10.2022
SQL>
这个怎么样?
DELETE FROM table a
WHERE EXISTS (
SELECT 1 FROM table b
WHERE b.client_id = a.client_id
AND b.date > a.date
)