sql - 我应该如何重构子查询
问题描述
我知道将子查询写入查询的三种方法。
- 普通子查询
- 带子句
- 临时表
当查询中有多个子查询时,子查询会变得非常混乱,尤其是当您有嵌套子查询时。
With 子句是我的首选,但您只能在直接跟在 WITH 子句之后的 select 语句中使用 WITH 子句中的子查询(我相信)。
临时表很好,但在声明表时需要相当多的开销。
除了这些,还有其他方法可以重构子查询吗?他们之间有没有我没有考虑过的权衡?
解决方案
您遗漏了其他一些功能。
最明显的是观点。如果您有一个将被多次使用的复杂查询——尤其是可能在表之间实现业务规则的查询——那么视图非常有用。如果性能是一个问题,那么您可以将视图具体化。
子查询的一个常见用途是在表中生成额外的列——例如两列之间的差异。您可以将计算列用于这些计算,并使它们成为数据定义的一部分。
最后,您可以实现用户定义的函数。用户定义的表值函数很像带参数的视图。在某些情况下,这真的很有帮助。并且底层查询通常应该是相当优化的。
另一种类型的用户定义函数是标量函数。这些通常会产生更多开销,但有时会非常有用。
综上所述,如果您的查询结构清晰,那么子查询和 CTE 就不会显得“凌乱”。您实际上可能会发现您可以编写对您和其他阅读它们的人都有意义的很长的查询。
推荐阅读
- html - 使用 selenium 时如何等到触发 onload 事件?
- python - 带有 peek 的 python 文本 io 流?
- kotlin - 图像消失而不是在单击时更改为其他图像
- python - 如何为导航栏列表仪表板的单个项目着色
- nuxt.js - TypeError:模块应该导出一个函数:@vue/composition-api
- r - 如何从其他两个向量创建一个向量,一个用于标签,一个用于值?
- javascript - Node js中的三元函数返回Nan
- swift - 显示键盘时关闭“弹出”模式
- ssis - 如何使用 SSIS 变量值或项目参数值作为表达式主体,然后将其评估为另一个变量
- linux - 在小狗 linux 上配置 fox-toolkit 失败