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

时间:2010-11-23 00:25:58

标签: sql sql-server-2005 migration sql-server-2000

我刚刚找到了How to Find Rows which are Duplicates by a Key but Not Duplicates in All Columns?的适当解决方案,对存储过程进行了编码,然后了解到数据库停留在SQL Server 2000上。

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

有人能为我提供一套转换回SQL Server 2000方言的文件吗?

请注意,我有像这样的事情:

;
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是递归的。

2 个答案:

答案 0 :(得分:6)

两个选项(授予,两者都不漂亮 - 这就是我们喜欢CTE的原因)

选项1

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

选项2 将整个CTE SELECT作为表格放入查询的FROM部分。

SELECT *
FROM  (SELECT *
       FROM table1) oldCTE

答案 1 :(得分:3)

我认为不可能提出容易将任何 cte转换为非cte语句的规则。因为可能性太开放(特别是如果你正在使用递归CTE)。我能想到的最接近的是将每个CTE按顺序排除,将其分解为自己的查询,并使用它来填充以下查询使用的临时表。几乎没有效率,也没有在所有可能的情况下工作。