Sql Server - 子查询中的用户CTE

时间:2011-05-24 08:46:19

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

之前已经问过这个问题 -

How we can use CTE in subquery in sql server?

建议的唯一答案是“只需在顶部定义您的CTE并在子查询中访问它?”

这有效,但我真的希望能够在以下场景中使用CTE -

  1. 作为SELECT

  2. 中的子查询
  3. 作为SELECT

  4. 的FROM子句中的派生表

    这两个都在PostgreSQL中工作。使用Sql Server 2005,我得到“关键字'附近的语法不正确'。”。

    我希望它的原因是我的大多数查询都是动态构建的,我希望能够定义一个CTE,将其保存在某处,然后根据需要将其放入更复杂的查询中。

    如果Sql Server根本不支持这种用法,我将不得不接受它,但我没有看到任何声明不允许的内容。

    有谁知道是否有可能让它发挥作用?

2 个答案:

答案 0 :(得分:3)

在SQL Server中,CTE必须位于查询的顶部。如果动态构造查询,除了查询之外,还可以存储CTE列表。在将查询发送到SQL Server之前,可以在查询前添加CTE列表:

; with Cte1 as (...definition 1...),
  Cte2 as (...definition 2...),
  Cte3 as (...definition 3...),
  ...
...constructed query...

这假设您正在构建SQL Server之外的SQL。

您还可以考虑创建视图。视图可以包含CTE,它们可以用作子查询或派生表。如果您不经常生成SQL,仅在安装期间或作为部署的一部分生成SQL,则视图是一个不错的选择。

答案 1 :(得分:1)

SQL Server不支持这个非常需要的功能。我也一直在寻求帮助。 MS SQL Server不支持临时视图,而不支持PostgreSQL。上述解决方案也可能只有在事先生成所有CTE定义且每个子查询中都没有冲突名称时才有效 - 目的是每个级别的这些CTE定义可能不同子查询。

伤心但真实!!!

此致 卡皮尔