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