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)
对于此示例,这是一种简单的方法,删除1000个第一行:
DELETE FROM YOUR_TABLE WHERE ROWID IN
(SELECT ROWID FROM YOUR_TABLE FETCH FIRST 1000 ROWS ONLY);
Run Code Online (Sandbox Code Playgroud)
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)
| 归档时间: |
|
| 查看次数: |
8259 次 |
| 最近记录: |