首页 > 解决方案 > 我应该如何重构子查询

问题描述

我知道将子查询写入查询的三种方法。

当查询中有多个子查询时,子查询会变得非常混乱,尤其是当您有嵌套子查询时。

With 子句是我的首选,但您只能在直接跟在 WITH 子句之后的 select 语句中使用 WITH 子句中的子查询(我相信)。

临时表很好,但在声明表时需要相当多的开销。

除了这些,还有其他方法可以重构子查询吗?他们之间有没有我没有考虑过的权衡?

标签: sqlsql-server

解决方案


您遗漏了其他一些功能。

最明显的是观点。如果您有一个将被多次使用的复杂查询——尤其是可能在表之间实现业务规则的查询——那么视图非常有用。如果性能是一个问题,那么您可以将视图具体化。

子查询的一个常见用途是在表中生成额外的列——例如两列之间的差异。您可以将计算列用于这些计算,并使它们成为数据定义的一部分。

最后,您可以实现用户定义的函数。用户定义的表值函数很像带参数的视图。在某些情况下,这真的很有帮助。并且底层查询通常应该是相当优化的。

另一种类型的用户定义函数是标量函数。这些通常会产生更多开销,但有时会非常有用。

综上所述,如果您的查询结构清晰,那么子查询和 CTE 就不会显得“凌乱”。您实际上可能会发现您可以编写对您和其他阅读它们的人都有意义的很长的查询。


推荐阅读