我们如何在 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 中的子查询