【问题标题】:Is the 'WITH' clause only syntactic sugar?'WITH' 子句只是语法糖吗?
【发布时间】:2019-09-19 02:36:05
【问题描述】:

我试图找到在单个查询中多次迭代同一组数据的最佳方法,并且我开始想知道“with”是否会节省一些执行时间(通过减少次数我必须查询我需要使用的数据),因为有些人声称它只创建对源的引用(子查询),而另一些人声称它将查询结果存储在内存中,然后允许您查询它们(这就是我想要的)节省大量的执行时间。

为了更好地解释这里是我的代码简历:

WITH MY_DATA AS(
   SELECT
      TABLE_A, TABLE_A.B, TABLE_B.C
   FROM TABLE_A
   JOIN
      TABLE_B
      ON TABLE_A.SOME_FILTER = TABLE_B.SOME_FILTER
   WHERE SOME_OTHER_CONDITION = 0
)
SELECT
  SUM CASE WHEN(A = 'SOME_VALUE') THEN '1' ELSE 0 END
FROM MY_DATA
UNION ALL
SELECT
  SUM CASE WHEN(B = 'SOME_OTHER_VALUE') THEN '1' ELSE 0 END
FROM MY_DATA
UNION ALL
SELECT
  SUM CASE WHEN(C = 'YET_ANOTHER_VALUE') THEN '1' ELSE 0 END
FROM MY_DATA

在每个联合中使用子查询会有什么不同吗?还是我只是让它美观?

【问题讨论】:

  • 嗯,如果您进行大量迭代,这听起来像是#temp 表的案例。
  • 看看你的解释计划。
  • 重写查询,其中'MY_DATA'在所有3种情况下都是子查询,然后比较执行计划
  • my_data 查询将被执行 3 次,这里没有魔法。 with 子句不仅仅是语法糖,因为它允许recursive queries
  • 为什么不重写为3列的单行查询?

标签: sql sql-server


【解决方案1】:

SQL Server 将 CTE 视为每次引用 CTE 时作为 code 插入查询中的代码块。因此,您将它们解释为“语法糖”确实适用——在这种情况下和在这个数据库中。

这是特定于 SQL Server 的。其他数据库有时或总是实现 CTE。在这些数据库中,CTE 可以更轻松地删除公共代码(即重用 CTE 的具体化版本)。

此外,递归 CTE 不能以任何其他方式表达使用单个 SELECT 查询。因此,它们也有一个独立的目的。

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 2011-03-09
    • 1970-01-01
    • 2022-11-29
    • 2011-03-08
    • 2013-11-28
    • 2015-09-04
    • 2014-09-18
    • 2016-07-25
    相关资源
    最近更新 更多