删除除了一些行之外的所有行 - Oracle

Gur*_*uru 4 sql oracle

我想从表中删除一组行.我可以决定哪些行需要删除.只有当行数大于5(基于条件)时,我才会从表中删除行.

考虑这个示例数据

ID--Col1--Col2--
1   A      X
2   A      X
3   A      X
4   A      X
5   A      X
6   A      X
7   A      X
8   A      X
9   A      X
10   A      X
11   B      X
12   B      X
13   B      X
14   B      X
15   C      X
16   C      X
17   C      X
18   D      X
19   D      X
Run Code Online (Sandbox Code Playgroud)

我想删除5行{*,A,X},我需要保留5行(无论哪一行).我不会删除B,C&D,因为它们的数量小于5.

喜欢

delete from tableA
 --- I can decide on the rows to delete based on two conditions.
 where col1 = someCondition
   and col2 = someOtherCondition
   and rownum > 5 --- This dint work. I checked.
Run Code Online (Sandbox Code Playgroud)

我想也许我需要programmaticaly.任何建议都非常感谢.

Dav*_*dge 9

这将删除col1和col2的每个唯一组合的所有行,而不是rowid排序的前五个

delete from my_table
where rowid in
  (
  select rowid
  from
    (
    select rowid,
           row_number() over (partition by col1, col2 order by rowid) rownumber
    from   my_table
    )
  where rownumber > 5
  )
/
Run Code Online (Sandbox Code Playgroud)


Vin*_*rat 7

这将删除除了满足Col1和Col2两个条件的20行之外的所有行:

DELETE FROM tableA
 WHERE ROWID NOT IN (SELECT ROWID
                       FROM tableA
                      WHERE col1 = someCondition
                        AND col2 = someOtherCondition
                        AND rownum <= 20)
Run Code Online (Sandbox Code Playgroud)

如果您的数据集非常大,则以下内容可能会更快:

CREATE tableTemp as 
SELECT *
  FROM tableA
 WHERE col1 = someCondition
   AND col2 = someOtherCondition
   AND rownum <= 20;

TRUNCATE tableA;

INSERT INTO tableA (SELECT * FROM tableTemp);
Run Code Online (Sandbox Code Playgroud)

如果需要在操作期间访问数据,请用DELETE替换truncate.