删除Oracle数据库中的旧数据

时间:2015-03-04 03:47:41

标签: sql database oracle oracle11g sql-delete

我是数据库的新手我想要你们朋友的帮助。

我想删除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 )。今天输入的数据不会被删除,它应保持不变。

任何人都可以帮我这些吗?

1 个答案:

答案 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

你去了,关于日期的旧行现在被删除了。今天插入了剩余的行。