我注意到Sybase SQL Anywhere支持它们,但是无法找到有关ASE的任何文档。
如果没有,那么设计递归查询的最佳选择是什么?在SQL Server 2008中,我会使用CTE进行此操作,但如果这不可用?也许是一个功能?
答案 0 :(得分: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!
答案 1 :(得分:-2)
自1984年以来,标准和Sybase允许完全递归。我们通常在存储过程中执行递归,以便控制深度,避免无限循环,并且执行比未编译的SQL等更快。
存储过程对递归,结果集构造等没有限制。当然,将括号内容定义为View会使它再次变快(毕竟它是一个真实的视图,而不是我们必须实现的每个视图我们需要它的时间)。
重点是,如果你习惯了这个方法(服务器中的递归,一个为递归编码的proc),就像我一样,不需要CTE,它的新语法;未编译的速度;临时表;工作台;光标“行走”层次结构;所有这些都导致可怕的表现。
递归proc只读取数据,只读取数据,并只读取那些在递归的每个级别限定的行。它不使用游标。它不会“行走”,而是构建层次结构。
第二个选项是使用动态SQL。只需构建SELECT,每个层次结构一个,并继续添加UNION,直到用完级别为止;然后执行。
您可以使用函数来提供CTE的功能,但不要这样做。函数用于不同的,面向列的目的,代码受这些约束的约束。它是标量,适用于构造列值。存储过程和CTE是面向行的。