如果在表2中找不到两个字段的值组合,则从表1中删除记录

时间:2016-02-09 14:13:27

标签: plsql

我有这样的表结构:
表1包含col_a,col_b,col_c
表2包含col_a,col_b

我希望能够检查表1中是否有任何基于col_a和col_b值的col_a和col_b中的值与表2中的任何记录都不匹配的记录。惠斯特还使用DBMS_OUTPUT记录已删除的内容。

所以如果这是我的数据:

表1

--------------------------------------
       |col_a   | col_b     | col_c   |
--------------------------------------
Row 1 |'apple' | 'ham'     | 'water' |
------------------------------------
Row 2 |'pear'  | 'chicken' | 'water' |
-------------------------------------
Row 3 | 'apple' | 'pork'   | 'wine'  |
--------------------------------------

表2

----------------------------
      |col_a    | col_b     | 
----------------------------
Row 1 |'apple'  | 'ham'     |
----------------------------
Row 2 |'pear'   | 'pork'    |
----------------------------
Row 3 | 'orange'| 'chicken' |
----------------------------

在表1中,将删除第2行和第3行。

我已经尝试了下面的代码,但它什么也没有返回。我认为这是因为我比较了所有col_a,然后是所有col_b,但不是一起。

delete from table_1 t1
where t1.col_a not in (select t2.col_a from table_2 t2)
and t1.col_b not in  (select t2.col_b from table_2 t2)

2 个答案:

答案 0 :(得分:2)

要获得所需结果,请在IN中使用select

这允许您在选择中使用多个参数。

喜欢这个

delete from table_1 t1 
where (t1.col_a,t1.col_b) not in (select t2.col_a,t2.col_b from table_2 t2)

有关IN的详细信息。

答案 1 :(得分:1)

你使用||用于连接: 应该是这样的:

delete from table_1 t1
where t1.col_a || '-' || t1.col_b not in (select t2.col_a || '-' || t2.col_b from table_2 t2) ;

' - '是一个分隔符,理想情况下它可以是数据中不应该包含的任何字符。

一个sql脚本可能就是这样(我没有经过测试,也没有编写代码进行删除):

set serveroutput on;



  DECLARE 
  CURSOR MY_CURSOR IS  select * from table_1 t1 where t1.col_a || '-' || t1.col_b not in (select t2.col_a || '-' || t2.col_b from table_2 t2) ;    
  COUNTER NUMBER :=0;  
  begin  
  FOR MYCUR IN MY_CURSOR LOOP

         BEGIN      
            -- SQL DELETE HERE

            -- LOG :
            DBMS_OUTPUT.PUT_LINE('row deleted'); 
            COUNTER := COUNTER + 1 ;
          EXCEPTION WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE('ERROR =>  ' || SQLERRM);
          END;
  END LOOP ;  
  DBMS_OUTPUT.PUT_LINE('Total : '||COUNTER );
  END;  
  /