2016-04-20 64 views
0

提前道歉,我偶爾是Oracle用戶。我將各種函數/過程使用的查找表放在一起,並且需要使用需要刪除或插入的行每天保持一次刷新。我將以下簡單的查詢放在一起,返回可以確定所需操作的列。一旦我返回了我的刪除數據,然後我需要從表A中刪除site_id和zone_ids匹配的所有記錄。我無法找出實現這一目標的最佳方式,我曾考慮將select語句作爲遊標運行,但我不確定如何使用返回的每條記錄中的site_id和zone_id從表A中刪除行。Oracle - 通過光標刪除或插入行

查詢,返回記錄從表-A被刪除

SELECT site_id,zone_id,upper(ebts_switch_name) 
FROM Table_A 
minus 
    (SELECT site_id,zone_id, upper(ebts_switch_name) 
    FROM [email protected]_db 
    UNION 
    SELECT site_id,zone_id,upper(ebts_switch_name) 
    FROM Table_C); 

查詢,返回記錄插入到表-A

SELECT cluster_id, site_id,zone_id, upper(trigram),upper(ebts_switch_name) 
FROM [email protected]_db 
WHERE site_id is NOT NULL 
minus 
SELECT cluster_name,site_id,zone_id,upper(trigram),upper(ebts_switch_name) 
FROM Table_A 

回答

2

可以在如下所示的方式直接使用您的語句:

DELETE FROM TABLE_A 
    WHERE (SITE_ID, ZONE_ID, UPPER(EBTS_SWITCH_NAME)) IN 
    (SELECT site_id, zone_id, upper(ebts_switch_name) 
     FROM Table_A 
     minus 
     (SELECT site_id, zone_id, upper(ebts_switch_name) 
      FROM [email protected]_db 
     UNION 
     SELECT site_id, zone_id, upper(ebts_switch_name) 
      FROM Table_C)); 

INSERT INTO TABLE_A (CLUSTER_NAME, SITE_ID, ZONE_ID, TRIGRAM, EBTS_SWITCH_NAME) 
    SELECT cluster_id, site_id, zone_id, upper(trigram), upper(ebts_switch_name) 
    FROM [email protected]_db 
    WHERE site_id is NOT NULL 
    minus 
    SELECT cluster_name, site_id, zone_id, upper(trigram), upper(ebts_switch_name) 
    FROM Table_A; 

好運。

+0

小錯字:應該是'Table_A MINUS(Table_B UNION Table_C)'不是'Table_A MINUS(Table_B UNION Table_A)'(它不會刪除任何東西)。編輯:只是注意到,這是最初的OP的錯誤。 – MT0

+0

感謝您的更新鮑勃,這符合我的需求我想我是在我的腦海裏工作。我將添加到由Perl腳本調用的過程中,並使用dbms輸出來抓取和記錄更新的行。 – MatteoS

+0

@ MT0 - 我也注意到了,但是嘿 - 我該爭辯誰? :-) –

1

我不明白你是什麼第一次查詢的意思,原因它幾乎與

SELECT * 
    FROM table_a 
MINUS 
SELECT * 
    FROM table_a 

表示空記錄集。

但是總體來說,使用DELETE語法

DELETE 
    FROM table_a 
WHERE (col1, col2) IN (SELECT col1, col2 
          FROM table_b); 

而且INSERT語法

INSERT INTO table_a (col1, col2) 
    SELECT col1, col2 
     FROM table_b; 
+0

感謝您的反饋意見,我將採用上面Bob提供的答案 - 對不起,我感到困惑我已經更新了delete語句,union最初輸入時應該與第三個表table_A一起使用。 – MatteoS