sql – Oracle:快速NOT IN用于多列

我需要同步两个表.我们假设这些表包含以下列:
Table1: A,B,C,D  
Table2: A,E

我需要在Table1中找到这样的行,表2中没有相应的(A,C)值的条目,然后将E计算为F(D)并更新Table2.

如果我需要匹配,例如只有A,我会写下面的查询

SELECT * FROM Table1 WHERE A NOT IN (SELECT A FROM Table2)

多列模拟似乎太慢了:

SELECT * FROM Table1 WHERE A NOT IN (SELECT A FROM Table2)
                       AND B NOT IN (SELECT B FROM Table2)
                       AND C NOT IN (SELECT C FROM Table2)

编写此类查询的最佳方法是什么?

解决方法

如果(a,b,c)在两个表中都是NOT NULL,那么NOT IN和NOT EXISTS都很可能(在我试过的verisons上)生成相同的执行计划.

如果(a,c)被声明为可为空,但是你知道这些列实际上不是null,你可以通过添加“AND a is not null AND b not not null来欺骗优化器进行散列反连接对于您的查询,AND c不为空. (您可能还需要在子查询添加/ * HASH_AJ * /提示.)

此外,以下查询不相同:

from table1
where (a,c) not in (select a,c from table2)

 from table1
where a not in(select a from table2)
  and b not in(select b from table2)
  and c not in(select c from table2)

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...