从Oracle SQL表中删除有限的N行

You*_*ufi 2 sql oracle delete-row

我想为在3个以上项目中工作的每位员工准确删除2行/记录。假设我有这张桌子:

+----------+-------------+
| employee |  Project    |
+----------+-------------+
|   1      |   p1        |
|   1      |   p2        |
|   1      |   p3        |
|   1      |   p4        |
|   2      |   p1        |
|   2      |   p3        |
|   3      |   p1        |
|   3      |   p4        |
|   3      |   p5        |
+----------+-------------+
Run Code Online (Sandbox Code Playgroud)

我可以查询哪些员工在三个以上的项目中工作。在这种情况下,标识为1的员工和标识为3的员工。查询应为:

select employee
  from (
    select employee, count(*) my_count
      from my_table
      group by employee
  ) VW
  where VW.my_count >= 3;
Run Code Online (Sandbox Code Playgroud)

删除哪一行并不重要,重要的是要为在三个以上项目中工作的每个员工删除两行/记录。结果表可能是例如:

+----------+-------------+
| employee |  Project    |
+----------+-------------+
|   1      |   p1        |
|   1      |   p2        |
|   2      |   p1        |
|   2      |   p3        |
|   3      |   p1        |
+----------+-------------+
Run Code Online (Sandbox Code Playgroud)

Pio*_*r R 5

对于此示例,这是一种简单的方法,删除1000个第一行:

DELETE FROM YOUR_TABLE WHERE ROWID IN 
(SELECT ROWID FROM YOUR_TABLE FETCH FIRST 1000 ROWS ONLY);
Run Code Online (Sandbox Code Playgroud)


Dmi*_*rov 4

SQL> select * from t;

  EMPLOYEE PR                                                                   
---------- --                                                                   
         1 p1                                                                   
         1 p2                                                                   
         1 p3                                                                   
         1 p4                                                                   
         2 p1                                                                   
         2 p3                                                                   
         3 p1                                                                   
         3 p4                                                                   
         3 p5                                                                   

SQL> delete from t
  2  where rowid in (
  3   select rid from (
  4          select rowid rid,
  5          row_number() over(partition by employee
  6          order by project desc) rn,
  7          count(*) over(partition by employee) cnt
  8          from t
  9   ) where cnt >= 3 and rn <=2
 10  )
 11  /

4 rows deleted.

SQL> select * from t;

  EMPLOYEE PR                                                                   
---------- --                                                                   
         1 p1                                                                   
         1 p2                                                                   
         2 p1                                                                   
         2 p3                                                                   
         3 p1        
Run Code Online (Sandbox Code Playgroud)