子查询分解问题

Posted

技术标签:

【中文标题】子查询分解问题【英文标题】:subquery factoring questions 【发布时间】:2010-06-03 03:38:39 【问题描述】:

请解释一下。

a) “子查询分解”用于替换不相关的子查询。那么相关子查询呢?有什么方法可以将相关的子查询移动到“WITH”子句部分?

b) “子查询”“子查询分解”是否只执行一次?

c) “子查询”与“子查询分解”哪个更好

谢谢。

【问题讨论】:

【参考方案1】:

您可以使用子查询分解来替换不相关的子查询。 对于相关子查询,您到底是如何建议这样做的?

我不明白 (b) 部分,你能改述一下吗? 猜测您的意思: WITH 子句中的子查询通常只在执行主查询之前执行一次。

对于大型数据集,子查询分解显然更好,因为在大多数情况下(如果不是所有情况)您只执行一次子查询。对于较小的数据集,创建临时表的开销可能比实际查询花费的时间更长。

除了上面提到的性能问题之外,子查询分解可以使代码更加简洁和易于维护。

【讨论】:

“WITH 子句中的子查询通常只在执行主查询之前执行一次。”所以子查询分解是独立执行的,并且只执行一次。所以不能完全替代相关子查询。 我看不到任何可能的方法将相关子查询放入 WITH 子句中。相关子查询是需要主查询中的值才能运行的查询。 @Jeffrey:是的。跟进后,我意识到OP是真诚的。编辑了那部分。感谢您的评论。【参考方案2】:

您所说的“子查询分解”真的是指重新使用子查询分解吗?重构是改变例程以提高维护和可读性而不改变其结果的过程。有时无法将子查询重构为公共表表达式(“WITH”子句)。此外,始终使用 CTE 或始终使用子查询(或派生表)没有黄金法则。这取决于数据和 DBMS,哪种方法效果最好。

【讨论】:

在我的问题中,“子查询分解”是指使用“WITH”子句替换传统子查询。

以上是关于子查询分解问题的主要内容,如果未能解决你的问题,请参考以下文章

递归 SQL:使用递归子查询分解的聚合函数

Oracle系列:(14)子查询

SQL相关子查询与非相关子查询

如何强制子查询像 #temp 表一样执行?

mysql 必知必会整理—子查询与连接表[八]

在数值中拆分/分解mysql字符串