sql - 如何编写优化的 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 次?
解决方案
尝试使用完全外连接。
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 过滤器”以获取您感兴趣的记录。
推荐阅读
- ruby-on-rails - Rails:从位于单独数据库中的 has_one 关联获取信息
- sql - 使用 DATEDIFF、GETDATE 了解未完成的日子
- c# - 如何在 WPF .NET Core 应用程序中启用控制台?
- jquery - jQuery - 如果 hasClass 设置滚动条的位置
- java - 如何获取 JSON 属性并将其存储在 JAVA 中的数组中?
- javascript - 如何在 Reactjs 中将 props 传递给子组件
- java - 如何在不锁定 UI 线程的情况下在 Android 中等待?
- python - swig 为 c 代码生成 python 包装器 - 来自 numpy.array() 的 IN_ARRAY 和 ARGOUT
- python-3.x - 当我运行这个 for 循环时,为什么我的笔记本崩溃了,解决方法是什么?
- html - 如何实现从下到上的过渡