【问题标题】:How we can use CTE in subquery in sql server?我们如何在 sql server 的子查询中使用 CTE?
【发布时间】:2010-12-27 05:09:38
【问题描述】:

我们如何在 SQL Server 的子查询中使用 CTE?

喜欢:

SELECT id (I want to use CTE here), name FROM table_name

【问题讨论】:

  • 叹息。为什么不提供更多背景信息?例如....你想达到什么目的?为什么你认为你想在这里使用 CTE?你已经尝试了什么?为什么它不起作用?等
  • 叹息。叹。为什么每个人都想要这么多上下文? TSQL 具有一成不变的语法。在我们被允许执行语句之前,我们不必说服 SQL 服务器为什么结果是有价值的。您在此站点上提供的上下文越多,版主就越有可能无法通过它并且他们会投票关闭。叹息。
  • 完全同意@RonnieOverby 的观点。上下文是如何在子查询中使用 CTE(它在标题中)。这是一个更清晰的版本:解释如何执行以下查询: SELECT * FROM (WITH cte AS (一个不错的 SELECT 语句) SELECT 一些字段或计算,或者可能是聚合 FROM cte ) AS x 可能加入另一个表
  • 好的,这里有一些上下文:我正在用 SQL 构建一个规则引擎,规则由用户定义。所以我有一个存储过程,它根据规则动态生成 SQL。 SP 返回生成的 SQL 语句,例如WITH cte1 (), cte2 () 等 SELECT ... FROM cte1 JOIN cte2 ON... 现在我想要另一个 SP 生成结果摘要,例如SELECT COUNT(*) FROM (%s) 其中 %s 是第一个 SP 生成的 SQL。我知道动态 SQL 的安全风险。此应用程序需要即时生成 SQL,即规则引擎。

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


【解决方案1】:

使用所有 CTE 的 UNION 集创建具有 CTE/多个 CTE 的视图

CREATE VIEW [dbo].[_vEmployees] 
AS 
    WITH 
    TEST_CTE(EmployeeID, FirstName, LastName, City, Country)
        AS (
            SELECT EmployeeID, FirstName, LastName, City, Country FROM Employees WHERE EmployeeID = 4
        ), 
    TEST_CTE2
        AS (
            SELECT EmployeeID, FirstName, LastName, City, Country FROM Employees WHERE EmployeeID = 7
        )
    SELECT EmployeeID, FirstName, LastName, City, Country FROM TEST_CTE UNION SELECT * FROM TEST_CTE2
GO

现在,在子查询中使用它

SELECT * FROM Employees WHERE EmployeeID IN (SELECT EmployeeID FROM _vEmployees)

【讨论】:

  • 谢谢Bhuwan Maharjan,我想用 CTE 创建一个视图,这很有帮助。赞!!!
【解决方案2】:

它不起作用:

select id (I want to use CTE here), name from table_name

不能在子查询中使用 CTE。

您可以将其视为一种变通方法:

CREATE VIEW MyCTEView AS ..here comes your CTE-Statement.

那么你可以这样做:

select id (select id from MyCTEView), name from table_name

【讨论】:

  • 我多次希望能够将 CTE 用作派生表。如果有一种不涉及创建数据库对象(临时)的方法,我会喜欢的。
【解决方案3】:

只需在顶部定义您的 CTE 并在子查询中访问它?

WITH YourCTE(blubb) AS
(
    SELECT 'Blubb'
)
SELECT id,
       (SELECT blubb FROM YourCTE),
       name
FROM   table_name

【讨论】:

  • 这不能缓解相关子查询。
  • 没有办法将条件传递给WITH 语句,所以这样做没有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 2010-11-03
  • 1970-01-01
相关资源
最近更新 更多