Plsql 如果在表2中找不到表1中两个字段的值组合,则从表1中删除记录
我有这样一个表结构: 表1包含a列、b列和c列 表2包含列a、列b 我希望能够根据列a和列b的值,检查表1中是否有任何列a和列b中的值与表2中的任何记录都不匹配的记录。另外,使用DBMS_输出记录已删除的内容 如果这是我的数据: 表1Plsql 如果在表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'
--------------------------------------
|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-啦啦队走错了路。我不知道这个方法。有趣的是,我不知道这个方法。