在oracle中通过语句有条件地删除行



我有这样的数据库(示例(

日期13.10.20222022年10月12日15.10.2022[/tr>16.10.2022[/tr>
client_id 照片类型
1 许可证
1 ident
2 ident
2 许可证 2022年10月14日
3 许可证 15.10.2022
4 识别

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
)

最新更新