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

Plsql 如果在表2中找不到表1中两个字段的值组合,则从表1中删除记录,plsql,Plsql,我有这样一个表结构: 表1包含a列、b列和c列 表2包含列a、列b 我希望能够根据列a和列b的值,检查表1中是否有任何列a和列b中的值与表2中的任何记录都不匹配的记录。另外,使用DBMS_输出记录已删除的内容 如果这是我的数据: 表1 -------------------------------------- |col_a | col_b | col_c | -------------------------------------- Row 1 |'apple'

我有这样一个表结构: 表1包含a列、b列和c列 表2包含列a、列b

我希望能够根据列a和列b的值,检查表1中是否有任何列a和列b中的值与表2中的任何记录都不匹配的记录。另外,使用DBMS_输出记录已删除的内容

如果这是我的数据:

表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行

我尝试了下面的代码,但它没有返回任何结果。我认为这是因为我比较了所有的a列,然后比较了所有的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)

将| |用于混凝土浇筑: 应该是这样的:

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;  
  /

将| |用于混凝土浇筑: 应该是这样的:

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;  
  /

为了获得所需的结果,请在选择中使用

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

像这样

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)

有关的更多详细信息。

为了获得所需的结果,请在选择中使用

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

像这样

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)

更多细节。

哦,太好了!谢谢@Jean Christophen Blanchard你知道如何合并DBMS|U输出来给我一个已删除内容的日志吗?如果你想要日志,我想你可以制作一个光标,然后在光标内部删除每一行并制作输出:光标我的|U光标是从表|1 t1中选择的*其中t1.col|a|“-”t1.col b不在选择t2.col|a|“-”中t2.表2中的列b t2;再次感谢。我将把你的回答记为已被接受。正如你回答我最初的问题。我现在将查看您关于游标的回答/评论,看看它是否适合我。希望我不需要任何进一步的帮助。是的,我现在看到了您编辑的答案:D-啦啦队走错了路。而不是使用select*from table_1 t1,其中t1.col_a,t1.col_b不在select t2.col_a,t2.col_b from table_2 t2Oh太棒了!谢谢@Jean Christophen Blanchard你知道如何合并DBMS|U输出来给我一个已删除内容的日志吗?如果你想要日志,我想你可以制作一个光标,然后在光标内部删除每一行并制作输出:光标我的|U光标是从表|1 t1中选择的*其中t1.col|a|“-”t1.col b不在选择t2.col|a|“-”中t2.表2中的列b t2;再次感谢。我将把你的回答记为已被接受。正如你回答我最初的问题。我现在将查看您关于游标的回答/评论,看看它是否适合我。希望我不需要任何进一步的帮助。是的,我现在看到了您编辑的答案:D-啦啦队走错了路。我不知道这个方法。有趣的是,我不知道这个方法。