如何编写优化的SQL查询?

时间:2019-05-02 23:33:58

标签: sql

如何编写优化的SQL查询以获取表1中未包含在表2和表3中的结果,类似地在表2中不在表1和表3中以及对于表3中的结果不在表1中和表2

我正在尝试提高我目前正在处理的查询的性能

TABLE A 
LEFT JOIN B
LEFT JOIN C 
WHERE B is NULL and C is NULL

UNION  

TABLE B 
LEFT JOIN A
LEFT JOIN C 
WHERE A is NULL and C is NULL

UNION  

TABLE C 
LEFT JOIN A
LEFT JOIN B 
WHERE A is NULL and B is NULL

有什么方法可以避免3次读取表格?

2 个答案:

答案 0 :(得分:0)

尝试使用完全外部联接。

select a.*, b.*, c.*
from a full outer join b on
        a.A_keys = b.B_keys
    full outer join c on
        a.A_keys = c.C_keys AND
        b.B_keys = c.C_keys

正如其他人所指出的那样,因为您没有提供样本数据或联接条件,所以无法猜测第二次联接(至c)是否需要条件A和B或仅条件A或仅条件B。因此,您需要工作对你自己有点偏爱。

作为参考,FULL OUTER JOIN就像一口气做一次LEFT和RIGHT OUTER JOIN。也就是说,它将返回:

  • 在联接(INNER联接)两边都匹配的所有记录,加上
  • 所有在LEFT表中但不在右边的记录(LEFT外部联接)。右表记录将为NULL
  • 所有在RIGHT表中但不在左边的记录(RIGHT外部联接)。左表记录将为NULL

我将留给您添加“ NULL过滤器”以获取您感兴趣的记录。

答案 1 :(得分:-1)

那么,A独特,B独特,C独特?由于其他表格中没有其他行,我想您只是想要

SELECT * FROM A
UNION
SELECT * FROM B
UNION 
SELECT * FROM C