【问题标题】:Does Sybase ASE 12.5 support Common Table Expressions?Sybase ASE 12.5 是否支持公用表表达式?
【发布时间】:2011-01-26 10:39:27
【问题描述】:

我注意到 Sybase SQL Anywhere 支持它们,但找不到任何关于 ASE 的文档。

如果没有,我设计递归查询的最佳选择是什么?在 SQL Server 2008 中,我会使用 CTE,但如果它不可用?也许是一个函数?

【问题讨论】:

    标签: common-table-expression sap-ase


    【解决方案1】:

    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!

    【讨论】:

      【解决方案2】:
      1. 自 1984 年以来,标准和 Sybase 允许完全递归。我们一般在一个存储过程中进行递归,这样可以控制深度,避免死循环,执行速度比未编译的SQL快等。

        存储过程对递归、结果集构造等没有限制。当然,将括号的内容定义为视图会使其再次更快(毕竟它是一个真正的视图,而不是我们必须实现每个时间我们需要它)。

        要点是,如果你习惯了这种方法(服务器中的递归,一个为递归编码的过程),就像我一样,就不需要 CTE,它的新语法;未编译的速度;临时表;工作台;光标“行走”层次结构;所有这些都导致了可怕的表现。

        递归过程只读取数据,只读取数据,并且只读取符合每个递归级别的行。它不使用游标。它不是“行走”,而是建立层次结构。

      2. 第二种选择是使用动态 SQL。只需构造 SELECT,层次结构的每一级,然后继续添加 UNION,直到用完所有级别;然后执行。

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

      【讨论】:

      • @PerformanceDBA:CTE 的 SQL Server 与物化视图不同(也与您的示例不同)。虽然它们可以以与您发布的方式相同的方式使用(尽管您的代码在 SQL Server 中同样有效并且不需要使用 CTE),但 CTE 也可以是自引用的,允许递归查询,否则这是不可能的.由于 OP 询问递归,我怀疑这就是原因。有关详细信息,请参阅msdn.microsoft.com/en-us/library/ms186243.aspx
      • 物化视图是索引视图,并且很像表格。这是内联 [非物化] 视图或派生表的示例。有人称其为子查询。
      • @PerformanceDBA:不可能,我指的是纯递归遍历由父子关系表示的树结构。虽然有一些不需要递归的表示树的技术,但我熟悉的 ANSI SQL 递归查询语法(在 SQL-99、IIRC 中引入,但不要坚持)使用的语法与(如果不完全兼容,除了 RECURSIVE 关键字的要求除外)存在于多个 RDBM 中的 CTE,包括 ASA 和 SQL Server。我还缺少另一种语法吗?
      • @PerformanceDBA:没有 CTE 就无法进行递归。如果您有不同的感觉,请发布示例。 Sybase SQL Anywhere 也使用 CTE(顺便说一句标准化的)进行递归,与 SQL 服务器相同。 Sybase ASE 似乎不支持 CTE,因此没有递归查询。你在这里混淆了很多术语。物化视图、内联查询等
      • @Paul Groke。 (1) 您的“内联查询”的技术术语是派生表。检查 SQL 规范和 Sybase 手册。 (2) 我接受 CTE 比带有递归的 proc 更容易编码。福利到此为止。事实(检查统计数据)是,CTE 的性能是可怕的。毫不奇怪:它必须构建临时表、工作表、映射,然后“遍历”层次结构。递归过程直接读取数据,并且只读取数据,它不需要临时任何东西,工作任何东西,走任何东西。
      猜你喜欢
      • 1970-01-01
      • 2017-11-21
      • 2013-07-04
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多