Хорошо, тогда Oracle. Поскольку предложение, которое вы использовали, там не работает, вам придется сначала удалить его, а затем создать. В зависимости от того, хотите ли вы просто игнорировать существование таблицы, вы можете выбрать один из следующих вариантов; примеры основаны на типовой схеме Скотта, поскольку у меня нет ваших таблиц.
Drop + Create
SQL> DROP TABLE dist_emp;
DROP TABLE dist_emp
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> CREATE TABLE dist_emp
2 AS
3 SELECT DISTINCT *
4 FROM emp
5 WHERE hiredate < TRUNC (SYSDATE - 30);
Table created.
SQL>
Используйте PL / SQL, чтобы удалить его, если он существует + Создать
SQL> DECLARE
2 l_table_name VARCHAR2 (30);
3 BEGIN
4 SELECT table_name
5 INTO l_table_name
6 FROM user_tables
7 WHERE table_name = 'DIST_EMP';
8
9 EXECUTE IMMEDIATE 'drop table dist_emp';
10 EXCEPTION
11 WHEN NO_DATA_FOUND
12 THEN
13 NULL;
14 END;
15 /
PL/SQL procedure successfully completed.
SQL> CREATE TABLE dist_emp
2 AS
3 SELECT DISTINCT *
4 FROM emp
5 WHERE hiredate < TRUNC (SYSDATE - 30);
Table created.
SQL>
Создать один раз + Усечь + Вставить
SQL> CREATE TABLE dist_emp
2 AS
3 SELECT *
4 FROM emp
5 WHERE 1 = 2;
Table created.
SQL> TRUNCATE TABLE dist_emp;
Table truncated.
SQL> INSERT INTO dist_emp
2 SELECT DISTINCT *
3 FROM emp
4 WHERE hiredate < TRUNC (SYSDATE - 30);
14 rows created.
SQL> -- Next time: don't drop it, just truncate its contents
SQL> TRUNCATE TABLE dist_emp;
Table truncated.
SQL> INSERT INTO dist_emp
2 SELECT DISTINCT *
3 FROM emp
4 WHERE hiredate < TRUNC (SYSDATE - 30);
14 rows created.
SQL>
Дополнительно:
Я бы предложил вам всегда указывать все столбцы, вовлеченные в эту операцию. Не используйте *
. Это удобно для тестирования и демонстрации, но для производства - назовите их все, например,
insert into dist_emp (deptno, empno, ename, job, sal)
select deptno, empno, ename, job, sal
from emp
where hiredate < trunc(sysdate - 30);
вычитание 30 из sysdate выглядит как в предыдущем месяце . Если это так, ну, это не сработает примерно в 50% всех случаев (потому что месяцы, как правило, имеют 28/29, 30 или 31 день). Более безопасным вариантом может быть функция ADD_MONTHS
, например
where hiredate < trunc(add_months(sysdate, -1))