2016-04-20 34 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