首页 > 解决方案 > 如何编写优化的 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 次?

标签: sql

解决方案


尝试使用完全外连接。

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 过滤器”以获取您感兴趣的记录。


推荐阅读