我是数据库的新手我想要你们朋友的帮助。
我想删除Oracle数据库中除最近数据
之外的行例如: 删除昨天的数据,不想删除数据库中的今天数据。
考虑一个有5行的表,最近添加了2行(今天)。我希望2行不变,删除剩余的2行。
A B C- Row
D 1 2 3 - old data
E 4 5 6 - old data
F 7 8 9 - old data
G 3 2 1 - New data Entered today
H 6 3 2 - New data Entered today
我想删除该行( D,E和F )。今天输入的数据不会被删除,它应保持不变。
任何人都可以帮我这些吗?
答案 0 :(得分:0)
考虑一个有5行的表,其中最近添加了2行(今天)
当您说"今天"时,我假设您的表格中有一个 DATE 列,以准确判断某行已插入。
我们举一个简单的例子来了解如何删除表中的旧行。
说我有一张桌子t
:
SQL> SELECT * FROM t;
EMPNO ENAME DEPTNO EDATE
---------- ---------- ---------- ---------
7369 SMITH 20 03-MAR-15
7499 ALLEN 30 03-MAR-15
7521 WARD 30 03-MAR-15
7566 JONES 20 04-MAR-15
7654 MARTIN 30 04-MAR-15
7698 BLAKE 30 02-MAR-15
7782 CLARK 10 02-MAR-15
7788 SCOTT 20 02-MAR-15
7839 KING 10 02-MAR-15
7844 TURNER 30 02-MAR-15
7876 ADAMS 20 02-MAR-15
7900 JAMES 30 02-MAR-15
7902 FORD 20 02-MAR-15
7934 MILLER 10 02-MAR-15
14 rows selected.
现在我想删除比今天更早的行。今天的日期是:
SQL> SELECT SYSDATE FROM DUAL;
SYSDATE
---------
04-MAR-15
现在有一个问题, sysdate 将有 datetime 元素。因此,您需要具体说明是否只需要截断日期部分,或者是否要将其与时间部分保持一致。
SQL> SELECT to_char(SYSDATE, 'MM/DD/YYYY HH24:MI:SS') FROM DUAL;
TO_CHAR(SYSDATE,'MM
-------------------
03/04/2015 10:24:17
SQL>
因此,只需使用SYSDATE就可以过滤日期值小于SYSDATE的所有行。您需要使用 TRUNC 来确保根据日期部分过滤行,而不考虑时间部分。
SQL> DELETE FROM t WHERE edate < TRUNC(SYSDATE);
12 rows deleted.
SQL> SELECT * FROM t;
EMPNO ENAME DEPTNO EDATE
---------- ---------- ---------- ---------
7566 JONES 20 04-MAR-15
7654 MARTIN 30 04-MAR-15
你去了,关于日期的旧行现在被删除了。今天插入了剩余的行。