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