代码之家  ›  专栏  ›  技术社区  ›  John Saunders Andrey Morozov

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

  •  2
  • John Saunders Andrey Morozov  · 技术社区  · 14 年前

    我刚找到一个合适的解决方案 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 回复  |  直到 7 年前
        1
  •  6
  •   Brad    14 年前

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

    选择1

    创建临时表( # ,或者如果足够小 @ )把它当作是CTE。完成后放下。

    选择2 把整个CTE SELECT 作为一张桌子 FROM 查询的一部分。

    SELECT *
    FROM  (SELECT *
           FROM table1) oldCTE
    
        2
  •  3
  •   Philip Kelley    14 年前

    我认为不可能想出容易改变的规则 任何 将cte转换为非cte语句。因为这种可能性太开放了(特别是在使用递归cte的情况下)。我能想到的最接近的方法是对每个CTE进行排序,将其分解为自己的查询,并使用它填充一个临时表,该表由以下查询使用。几乎没有效率,也不能保证在所有可能的情况下都能工作。