我想删除表中的前3行和后3行。但是使用单个查询从表中删除数据。我正在使用oracle 10g。请给我oracle 10g的解决方案。
我的桌子就像:
SQL> SELECT * FROM EMP; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 7566 JONES MANAGER 7839 02-APR-81 2975 20 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 7782 CLARK MANAGER 7839 09-JUN-81 2450 10 7788 SCOTT ANALYST 7566 19-APR-87 3000 20 7839 KING PRESIDENT 17-NOV-81 5000 10 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 7876 ADAMS CLERK 7788 23-MAY-87 1100 20 7900 JAMES CLERK 7698 03-DEC-81 950 30 7902 FORD ANALYST 7566 03-DEC-81 3000 20 7934 MILLER CLERK 7782 23-JAN-82 1300 10 14 rows selected. I want output like this. target ------ 7566 JONES MANAGER 7839 02-APR-81 2975 20 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 7782 CLARK MANAGER 7839 09-JUN-81 2450 10 7788 SCOTT ANALYST 7566 19-APR-87 3000 20 7839 KING PRESIDENT 17-NOV-81 5000 10 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 7876 ADAMS CLERK 7788 23-MAY-87 1100 20
提前致谢。
答案 0 :(得分:2)
假设订购基于EMPNO
,那么您可以这样做:
delete from emp
where emp.empno in (select empno
from (select empno,
row_number() over (order by empno) as seqnum_asc,
row_number() over (order by empno desc) as seqnum_desc
from emp
) e
where seqnum_asc <= 3 or seqnum_sec <= 3
);
答案 1 :(得分:0)
试试这个:
DELETE FROM YourTable
WHERE ID IN
(
SELECT TOP 3 ID FROM YourTable ORDER BY ID ASC
UNION
SELECT TOP 3 ID FROM YourTable ORDER BY ID DESC
)
这将根据ID来选择表格中的前3个和最后3个寄存器。但是请确保在编码时没有人修改过表格,因为你可能会删除你不想要的寄存器。
答案 2 :(得分:0)
您可以使用子查询来检索前三行和后三行。顶级语句可以删除它们。您需要定义订单的内容,例如员工编号。
DELETE FROM EMP
WHERE EMPNO IN (
SELECT EMPNO
FROM (
SELECT EMPNO
FROM EMP
ORDER BY EMPNO ASC
)
WHERE ROWNUM <= 3
) OR EMPNO IN (
SELECT EMPNO
FROM (
SELECT EMPNO
FROM EMP
ORDER BY EMPNO DESC
)
WHERE ROWNUM <= 3
)