如果在ORACLE中使用了两个连接字段,则会导致FULL OUTER JOIN卡住

时间:2018-01-30 11:18:58

标签: sql oracle

我遇到了FULL OUTER JOIN的问题 查询:

SELECT
  count(e.id)
FROM 
  eligibility e 
FULL OUTER JOIN
  tr_entry t
    ON t.correlation_id2 = e.correlation_id2
    OR t.correlation_id = e.correlation_id
WHERE (
        (t.correlation_id IS NULL AND t.correlation_id2 IS NULL)
    OR
        (e.correlation_id IS NULL AND e.correlation_id2 IS NULL)
    ) 
    and e.PAIRING_DATE is NULL
    AND t.PAIRING_DATE IS NULL
;

查询刚刚停止,我必须重启Oracle。在小数据集上一切正常,但是当数据集很大(资格表中超过100万条记录)时,数据库卡住了。我必须在两个表上使用哪个索引?

1 个答案:

答案 0 :(得分:2)

您的评论:

  

是的,我试图找到tr_entry中没有匹配的所有资格记录

那么为什么要进行全外连接?这是没有意义的。您应该使用NOT EXISTS子句:

select *
from eligibility e
where not exists
(
  select *
  from tr_entry t
  where t.correlation_id  = e.correlation_id
     or t.correlation_id2 = e.correlation_id2
);

我不知道pairing_date列是如何发挥作用的,所以只需将它们放入查询中即可: - )