代码之家  ›  专栏  ›  技术社区  ›  Mohan

SQL:有没有任何理由使用子查询而不是CTE?

  •  0
  • Mohan  · 技术社区  · 6 年前

    我见过许多带有复杂嵌套子查询(以及子子查询和子子查询…)的SQL示例。有没有理由编写这样的复杂查询,而不是像在编程语言中使用变量分解复杂表达式那样使用WITH和cte?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    FROM 子句和正则联接可以使用带直接替换的CTE。

    子查询用于:

    • 相关子查询(通常不在
    • 横向连接(在支持 LATERAL APPLY 中的关键字
    • 标量子查询。

    子句(横向连接除外)可以使用CTE编写。

    为什么使用子查询而不使用CTE?最重要的原因是cte是SQL语言后来的一个补充。除了递归CTE之外,它们并不是真正需要的。当子查询被多次引用时,它们真的很方便,但是有人可能会说视图也有同样的用途。

        2
  •  1
  •   D-Shih    6 年前

    除非您的查询计划告诉您子查询性能比CTE好,否则我将使用 CTE

    子查询和简单(非递归)CTE版本,它们可能非常相似。您必须使用探查器和实际执行计划来发现任何差异。

    我会用 CTE公司

    1. CTE公司 可以递归地使用,但子查询不能使用它,这可以帮助您创建日历表或特别适合于树结构。
    2. CTE公司 作为(@Lukasz Szozda comment)更容易维护和阅读,因为您可以将复杂的查询分解为多个cte并给它们起好名字,这在编写主查询时非常方便。
        3
  •  0
  •   Stefanos Zilellis    6 年前

    不考虑性能: 子查询(在FROM子句处)是好的,只要有少量的、小的和简单的子查询,因此转换成CTE实际上会使它更难阅读。 考虑到性能因素: CTE可能会变得越复杂。如果是这样的话,他们就变得太危险了,不值得信任一些柚木和变化,并可能导致更激进的性能方法,如将所有cte转换为temp(#)。