从oracle sql表中删除有限的n行

时间:2014-04-06 17:24:04

标签: 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        |
+----------+-------------+

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

select employee
  from (
    select employee, count(*) my_count
      from my_table
      group by employee
  ) VW
  where VW.my_count >= 3;

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

+----------+-------------+
| employee |  Project    |
+----------+-------------+
|   1      |   p1        |
|   1      |   p2        |
|   2      |   p1        |
|   2      |   p3        |
|   3      |   p1        |
+----------+-------------+

2 个答案:

答案 0 :(得分: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        

答案 1 :(得分:2)

此示例的简单方法是删除1000个第一行:

DELETE FROM YOUR_TABLE WHERE ROWID IN 
(SELECT ROWID FROM YOUR_TABLE FETCH FIRST 1000 ROWS ONLY);