【问题标题】:Is CTE's stored (like a table) or do you create it each time you need it? (SQL Server 2005)CTE 是存储的(如表格)还是您每次需要时都创建它? (SQL Server 2005)
【发布时间】:2011-06-20 13:32:53
【问题描述】:

以前从未使用过 MS SQL Server,CTE 对我来说是新的。但这正是我刚刚开始的项目中所需要的。

有一张看起来像的桌子

TABLE group (
 'id' int,
 'parentId' int,
 'groupName' varchar(255)
)

所以我有一个动态页面,根据 get 参数,“组”我希望返回该组下方的所有内容。我很确定我可以设法为它编写 CTE 并使用它。

但是每次我想使用它时都要创建它吗? (基本上连接到数据库,运行 CTE 的设置,然后使用在此运行的查询)。 或者它们是否在创建后存储在数据库中并随时可以使用?

如果它们被存储,是否有任何类似于 sp_tables 等的命令来显示它/them? 因为如果它们被保存,那么可能已经存在执行此操作的查询。

【问题讨论】:

  • CTE 不是视图。如果您不理解这一点,那么它们就不是“(您)所需要的”

标签: sql sql-server-2005 common-table-expression


【解决方案1】:

CTE 只是形成 SQL 表达式的另一种方式。

如果有一条评论指出它“不是视图”,则它与内联视图非常相似。不同之处在于您可以在同一个查询中多次引用它,或者具有递归声明...

WITH cte AS (...) SELECT * FROM cte

is similar to

SELECT * FROM (...)


但是,它们不会被持久化。您甚至不能执行以下操作...

WITH
  cte AS
(
  ...
)

SELECT * INTO #temp FROM cte

SELECT * FROM cte

SELECT INTO 将起作用,但到第二次选择时,CTE 已超出范围...

【讨论】:

    【解决方案2】:

    CTE 在运行时进行评估/创建/使用。它们仅可用于WITH ... SELECT 之后的下一条 SQL 语句。

    可以将他们的结果集插入到表变量或临时表中,以使他们的结果在更长的时间内可用。

    您可能正在考虑一个视图。

    【讨论】:

    • 嗯,这是我需要的递归位,你能在视图中做到这一点吗?以及基于参数的递归搜索。但是他们在运行时被评估/......回答了我的问题。谢谢。
    • 您可能会发现有用的是将其封装在表值函数中,并在其定义中使用 CTE。另请注意;要使表值函数尽可能高性能,请将其定义为内联而不是多语句。然后,您可以(有效地)使用 CROSS APPLY 将另一个表有效地连接到该函数,类似于使用视图执行此操作的方式。 (如果您不熟悉这些术语,请愉快地使用谷歌搜索。)
    【解决方案3】:

    来自MSDN

    公用表表达式 (CTE) 可以是 被认为是一个临时结果集 在执行中定义的 单个 SELECT、INSERT 的范围, 更新、删除或创建视图 声明。 CTE 类似于 派生表,因为它不存储 作为一个对象,只持续 查询的持续时间。不像一个 派生表,CTE 可以是 自引用并且可以被引用 在同一个查询中多次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多