Sybase ASE 12.5是否支持公共表达式(CTE)?

4
我注意到Sybase SQL Anywhere支持它们,但找不到任何关于ASE是否也支持的文档。
如果不支持,那么设计递归查询的最佳选择是什么?在SQL Server 2008中,我会使用CTE来完成,但如果不可用呢?也许使用一个函数?
2个回答

0

Sybase ASE 12.5(以及15.0)不支持CTE。


您可以使用内部查询来解决您的问题。

像这样简单的CTE:

WITH Sales_CTE (Folders_Id)
AS
-- Define the CTE query.
(
    SELECT Folders_Id FROM Folders
)
SELECT Folders_Id FROM Sales_CTE

就相当于这个:

SELECT aux.Folders_Id
FROM (SELECT Folders_Id FROM Folders) aux

想了解更多信息,请查看this


-3
自1984年以来,标准和Sybase允许完全递归。通常我们在存储过程中执行递归操作,以控制深度、避免无限循环,并且执行速度比未编译的SQL要快等等。
存储过程对递归、结果集构建等没有限制。当然,将括号内容定义为视图会使其更快(毕竟这是一个真正的视图,不是每次需要时都必须实现的视图)。
重点是,如果您像我一样习惯于这种方法(在服务器上进行递归,编写递归的存储过程),则没有必要使用CTE(公共表表达式)的新语法;未编译的速度;临时表;工作表;游标“遍历”层次结构;所有这些导致极差的性能。
递归存储过程仅读取数据,而且只读取每个递归层次上符合条件的行。它不使用游标。它不“遍历”,而是建立层次结构。
第二个选择是使用动态SQL。只需构造SELECT语句,在层次结构的每个级别上添加UNION,直到没有级别为止。然后执行即可。

您可以使用函数来提供CTE的功能,但不建议这样做。函数旨在用于不同的、面向列的目的,代码受到这些限制的约束。它是标量的,适用于构造列值。存储过程和CTE是面向行的。


5
@PerformanceDBA: CTE在SQL Server中与物化视图不同(也与您的示例不同)。虽然它们可以像您发布的那样使用(尽管您的代码在SQL Server中同样有效,而且不需要使用CTE),但是CTE也可以自引用,允许进行否则不可能的递归查询。鉴于OP正在询问递归,我认为这就是原因所在。有关更多信息,请参见http://msdn.microsoft.com/en-us/library/ms186243.aspx。 - Adam Robinson
3
物化视图是索引视图,类似于表格。这是内联[非物化]视图或派生表的示例。有些人称之为子查询。 - OMG Ponies
1
@PerformanceDBA:所谓不可能,我是指纯递归遍历由父子关系表示的树结构。虽然有一些技术可以表示不需要递归的树,但我熟悉的 ANSI SQL 递归查询语法(我记得是在 SQL-99 中引入的,但请不要完全相信我)使用的语法与 CTE 非常相似(如果不考虑 RECURSIVE 关键字的要求,则完全兼容),这种语法在包括 ASA 和 SQL Server 在内的多个 RDBM 中都存在。还有其他我不知道的语法吗? - Adam Robinson
1
@PerformanceDBA:如果没有CTE,你无法进行递归。如果您有不同的看法,请发表一个例子。另外,Sybase SQL Anywhere使用CTE(顺便说一下,这是标准化的)来进行递归,与SQL Server相同。但是,Sybase ASE似乎不支持CTE,因此无法进行递归查询。而且,您在这里混淆了很多术语。材料化视图、内联查询等。 - Paul Groke
2
@Paul Groke。(1)您“内联查询”的技术术语是派生表。请查阅SQL规范和Sybase手册。(2)我承认CTE比具有递归的存储过程更容易编写。好处就在于此。事实(请查看统计数据)是,CTE的性能非常糟糕。毫不奇怪:它必须构建临时表、工作表、映射,然后“遍历”层次结构。递归存储过程直接读取数据,只需要数据,不需要任何临时表、工作表或遍历操作。 - PerformanceDBA
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接