我想为每个在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 |
+----------+-------------+
答案 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);