2017-02-14 1 views
0

У меня есть 4 удаленных местоположения и явная база данных oracle. Места создают там некоторые транзакции, и я хочу запускать работу/процедуру один раз в день, чтобы вставить новые записи в центральную таблицу в нашем головном офисе. Табличная структура головного офиса и удаленного стола точно такая же.Как вставлять записи из таблиц ссылок данных с помощью НЕ СУЩЕСТВУЮЩИХ

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

INSERT INTO CENTRAL_DATA 
    SELECT * 
    FROM (SELECT LOCATION_ID, 
         INVOICE_ID, 
         INVOICE_DATE, 
         ANALYSIS_1, 
         ANALYSIS_2 
       FROM [email protected] 
      UNION ALL 
      SELECT LOCATION_ID, 
         INVOICE_ID, 
         INVOICE_DATE, 
         ANALYSIS_1, 
         ANALYSIS_2 
       FROM [email protected] 
      UNION ALL 
      SELECT LOCATION_ID, 
         INVOICE_ID, 
         INVOICE_DATE, 
         ANALYSIS_1, 
         ANALYSIS_2 
       FROM [email protected]) 
    WHERE NOT EXISTS (SELECT * FROM CENTRAL_DATA) 

Любая помощь будет очень признательна. Спасибо.

ответ

1

Ваш запрос не вставляет ничего, если существует запись в таблице CENTRAL_DATA. Вам не хватает критериев выбора. Какого же критерия я не знаю. Может быть, вы хотите вставить только тогда, когда нет записи для определенного места? Запрос будет таким:

INSERT INTO CENTRAL_DATA 
    SELECT * 
    FROM (SELECT LOCATION_ID, 
         INVOICE_ID, 
         INVOICE_DATE, 
         ANALYSIS_1, 
         ANALYSIS_2 
       FROM [email protected] 
      UNION ALL 
      SELECT LOCATION_ID, 
         INVOICE_ID, 
         INVOICE_DATE, 
         ANALYSIS_1, 
         ANALYSIS_2 
       FROM [email protected] 
      UNION ALL 
      SELECT LOCATION_ID, 
         INVOICE_ID, 
         INVOICE_DATE, 
         ANALYSIS_1, 
         ANALYSIS_2 
       FROM [email protected]) I 
    WHERE NOT EXISTS (SELECT 1 
         FROM CENTRAL_DATA d 
         where d.location_id=i.location_id) 

Однако увидеть комментарии о том, почему это не всегда хорошая идея: Oracle: how to INSERT if a row doesn't exist

+0

Спасибо за ответ. Записи будут уже присутствовать в таблице CENTRAL_DATA, связанной с каждым местоположением, я просто хочу вставить то, что не доступно. В этом случае мои уникальные идентификаторы будут краткими. – user3625561

+0

это сработало, но потребовалось 5 минут для 8 удаленных мест и 143 новых записей. Поскольку это будет работать ежедневно один раз, я не беспокоюсь о времени выполнения. Если какой-либо быстрый метод доступен, я открыт для него. Еще раз спасибо. – user3625561

+0

Возможно, объединение в трех местах замедляет его. Попробуйте сделать это один за другим. – Rene

Смежные вопросы