Скопируйте таблицу в другую без дубликатов - PullRequest
1 голос
/ 30 апреля 2019

Я написал скрипт bash для копирования одной таблицы в другую, а затем он удалит все записи из исходной таблицы, но у меня возникла проблема.

CREATE TABLE IF NOT EXISTS $TABLE AS SELECT DISTINCT * INTO $TABLE FROM T1 WHERE DTA_RIF < TRUNC (SYSDATE -30);
DELETE FROM T1 WHERE DTA_RIF < TRUNC (SYSDATE -30);

В этом запросе у меня есть дубликаты, и я не хочу вставлять одинаковые записи.У меня нет ПК, поэтому я не могу присоединиться.Я думал, что с DISTINCT я решу свою проблему, но я не смог этого сделать.

Ответы [ 3 ]

1 голос
/ 30 апреля 2019

возможно, вы получаете повторяющиеся записи, потому что записи не совпадают с другими записями точно во всех столбцах, вы можете решить эту проблему, используя один столбец в качестве ссылки для различия.

0 голосов
/ 30 апреля 2019

Хорошо, тогда 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))
    
0 голосов
/ 30 апреля 2019

СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ $ ТАБЛИЦА, КАК ВЫБРАТЬ ЗНАЧЕНИЕ * ОТ T1 ГДЕ DTA_RIF

с помощью этого запроса вы можете получить различные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...