如何使用公用表表达式将 SQL 查询转换为不使用公用表表达式的 SQL 查询(对于 SQL Server 2000)

How to Convert a SQL Query using Common Table Expressions to One Without (for SQL Server 2000)

提问人:John Saunders 提问时间:11/23/2010 最后编辑:CommunityJohn Saunders 更新时间:11/24/2010 访问量:1289

问:

我刚刚找到了一个适当的解决方案,即如何查找按键重复但在所有列中不重复的行?,对存储过程进行编码,然后得知数据库卡在SQL Server 2000。

当然,我的解决方案很大程度上依赖于公用表表达式。

谁能为我提供一组用于转换回 SQL Server 2000 方言的 ru les?

请注意,我有这样的东西L:

;
WITH CTE1 AS ( ... ),
CTE2 AS (SELECT ... FROM CTE1 ... ),
CTE3 AS (SELECT ... FROM CTE1 INNER JOIN CTE2 ...)
SELECT * FROM CTE3
WHERE criteria
ORDER BY sequence

这似乎会让事情变得更有趣......


更新:没有一个 CTE 是递归的。

迁移 SQL-Server-2000

评论

0赞 RC_Cleland 11/23/2010
约翰,我敢肯定,您引用的帖子中没有一个答案被标记为答案,这只是一个疏忽。
0赞 John Saunders 11/24/2010
@RC_Cleland:这不是疏忽。这篇文章是昨天的,我还没有机会尝试这些建议。最后期限就是这样。例如,这个问题(2000 年迁移)出现在昨天的 17:08 - 距离我不得不离开一天不到一个小时。
0赞 Samuel Neff 2/18/2011
如果您实际上要转换单个查询,则执行此操作可能比转换通用查询更容易,尤其是当您有示例源和结果数据进行验证时。

答:

3赞 Philip Kelley 11/23/2010 #1

我认为不可能提出可以轻易将任何 cte 转换为非 cte 语句的规则。因为可能性过于开放(特别是如果您正在使用递归 CTE)。我能想到的最接近的方法是按顺序获取每个 CTE,将其分解为自己的查询,并使用它来填充以下查询使用的临时表。效率低下,不能保证在所有可能的情况下都能工作。

评论

0赞 John Saunders 11/23/2010
对不起,应该指定没有一个是递归的。
6赞 Brad 11/24/2010 #2

两种选择(当然,两者都不漂亮——这就是我们喜欢 CTE 的原因)

选项 1

创建一个临时表(或者如果足够小),并像引用 CTE 一样引用它。完成后放下。#@

选项 2将整个 CTE 作为表放在查询部分中。SELECTFROM

SELECT *
FROM  (SELECT *
       FROM table1) oldCTE

评论

0赞 John Saunders 2/18/2011
很抱歉延迟接受您的回答。我最终得到了临时表,并解决了一个问题。