我们如何在 sql server 的子查询中使用 CTE?

Posted

技术标签:

【中文标题】我们如何在 sql server 的子查询中使用 CTE?【英文标题】:How we can use CTE in subquery in sql server? 【发布时间】: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,即规则引擎。 【参考方案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 语句,所以这样做没有意义。

以上是关于我们如何在 sql server 的子查询中使用 CTE?的主要内容,如果未能解决你的问题,请参考以下文章

在SQL Server的子查询视图内联函数等数据库对象中,不应该单独使用ORDER BY语句

ORACLE LEFT JOIN 子查询 在SQL SERVER中可以使用如图中的子查询,ORACLE中怎么实现

SQL Server Compact Edition 中的子查询

SQL Server - 如何优化此查询?

SQL Server:根据来自其他 2 个表的子查询从表中选择

SQL Server 查询以根据用户提供的 id 获取嵌套的子记录