删除目标中的前 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
)
我想删除 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
)