删除目标中的前 3 行和后 3 行 Table

Delete First 3 Rows & Last 3 Rows in Target Table

我想删除 table.But 中的前 3 行和后 3 行,使用单个查询从 table.I 中删除数据,我正在使用 oracle 10g。请给我 oracle 10g 的解决方案。

我的 table 就像:


SQL> SELECT * 来自 EMP;

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- ---------- ---------- ---------- -- ------ ---------- ----------
      7369 史密斯文员 7902 17-DEC-80 800 20
      7499 艾伦推销员 7698 20-FEB-81 1600 300 30
      7521 病房推销员 7698 22-FEB-81 1250 500 30
      7566 琼斯经理 7839 02-APR-81 2975 20
      7654 马丁推销员 7698 28-SEP-81 1250 1400 30
      7698 布莱克经理 7839 01-MAY-81 2850 30
      7782 克拉克经理 7839 09-JUN-81 2450 10
      7788 斯科特分析师 7566 19-APR-87 3000 20
      7839 国王总统 17-NOV-81 5000 10
      7844 特纳销售员 7698 08-SEP-81 1500 0 30
      7876 亚当斯文员 7788 23-MAY-87 1100 20
      7900 詹姆斯文员 7698 03-DEC-81 950 30
      7902 福特分析师 7566 03-DEC-81 3000 20
      7934 米勒文员 7782 23-JAN-82 1300 10

选择了 14 行。

我想要这样的输出。

目标
------

7566 琼斯经理 7839 02-APR-81 2975 20
7654 马丁推销员 7698 28-SEP-81 1250 1400 30
7698 布莱克经理 7839 01-MAY-81 2850 30
7782 克拉克经理 7839 09-JUN-81 2450 10
7788 斯科特分析师 7566 19-APR-87 3000 20
7839 国王总统 17-NOV-81 5000 10
7844 特纳销售员 7698 08-SEP-81 1500 0 30
7876 亚当斯文员 7788 23-MAY-87 1100 20

提前致谢。

假设排序是根据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
                       );

试试这个:

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
)

这将 select 从您的 table 中考虑 ID`s 的前 3 个和后 3 个寄存器。但请确保在您编写代码时没有人修改 table,因为您可能会删除不想删除的寄存器。

您可以使用子查询来检索前三行和后三行。顶级语句可以删除它们。您需要一些定义订单的东西,例如员工编号。

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
)