我有这样的表结构:
表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)
答案 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;
/