2010-11-23 30 views
2

我刚刚发现了一个适当的解决方案,将存储过程编码为How to Find Rows which are Duplicates by a Key but Not Duplicates in All Columns?,然后得知数据库停留在SQL Server 2000.如何使用通用表表达式将SQL查询转换为无(适用于SQL Server 2000)

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

任何人都可以提供一套ru转换回SQL Server 2000方言?

请注意,我有事情喜欢thisL:

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

+0

约翰,我相信这只是一个疏忽,您引用的帖子中的答案都不会被标记为答案。 – 2010-11-23 02:26:12

+0

@RC_Cleland:这不是疏忽。这个帖子是从昨天开始的,我没有机会尝试这些建议。截止日期是这样的。例如,这个问题(2000年迁移)在昨天17:08发生 - 不到一个小时,我不得不离开一天。 – 2010-11-23 17:14:22

+0

如果你实际上有一个单一的查询来转换它可能会更容易做到这一点,而不是转换通用的东西,特别是如果你有示例源和结果数据进行验证。 – 2011-02-18 05:55:42

回答

6

两个选项(当然,也不是漂亮的 - 这就是为什么我们喜欢的CTE)

OPTION 1

创建临时表(#,或者如果有足够@小),并把它称为你会CTE。完成后放下。

OPTION 2 把整个CTE SELECT作为表中查询的FROM部分。

SELECT * 
FROM (SELECT * 
     FROM table1) oldCTE 
3

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

相关问题