子查询分解问题
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”子句替换传统子查询。以上是关于子查询分解问题的主要内容,如果未能解决你的问题,请参考以下文章