如何使用NOT EXISTS从数据链接表中插入记录

时间:2017-02-14 12:25:42

标签: sql oracle oracle11g oracle10g

我安装了4个远程位置和oracle express数据库。这些位置在那里创建了一些交易,我想在一天内运行一次作业/程序,将新记录插入我们总部的中央表格。总公司和远程桌的表结构完全相同。

我正在运行以下查询但它没有插入任何记录。我不想每天使用物化视图或丢弃总公司表并重新创建它。

INSERT INTO CENTRAL_DATA
   SELECT   *
     FROM   (SELECT   LOCATION_ID,
                      INVOICE_ID,
                      INVOICE_DATE,
                      ANALYSIS_1,
                      ANALYSIS_2
               FROM   INVOICEDATA@LOC1
             UNION ALL
             SELECT   LOCATION_ID,
                      INVOICE_ID,
                      INVOICE_DATE,
                      ANALYSIS_1,
                      ANALYSIS_2
               FROM   INVOICEDATA@LOC2
             UNION ALL
             SELECT   LOCATION_ID,
                      INVOICE_ID,
                      INVOICE_DATE,
                      ANALYSIS_1,
                      ANALYSIS_2
               FROM   INVOICEDATA@LOC3)
    WHERE   NOT EXISTS (SELECT   * FROM CENTRAL_DATA)

任何帮助都将受到高度赞赏。 感谢。

1 个答案:

答案 0 :(得分:1)

当CENTRAL_DATA表中存在记录时,您的查询不会插入任何内容。您缺少选择标准。那个标准是我不知道的。也许只有在没有特定位置的记录时才想插入?然后查询将是:

INSERT INTO CENTRAL_DATA
   SELECT   *
     FROM   (SELECT   LOCATION_ID,
                      INVOICE_ID,
                      INVOICE_DATE,
                      ANALYSIS_1,
                      ANALYSIS_2
               FROM   INVOICEDATA@LOC1
             UNION ALL
             SELECT   LOCATION_ID,
                      INVOICE_ID,
                      INVOICE_DATE,
                      ANALYSIS_1,
                      ANALYSIS_2
               FROM   INVOICEDATA@LOC2
             UNION ALL
             SELECT   LOCATION_ID,
                      INVOICE_ID,
                      INVOICE_DATE,
                      ANALYSIS_1,
                      ANALYSIS_2
               FROM   INVOICEDATA@LOC3) 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