私は、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 は必要ありません。コンパイルされていない速度; 一時テーブル; 作業台; 階層を「歩く」カーソル。すべてが恐ろしいパフォーマンスをもたらします。
再帰プロシージャは、データのみを読み取り、データ以外は何も読み取らず、再帰の各レベルで条件を満たす行のみを読み取ります。カーソルは使用しません。「歩く」のではなく、階層を構築します。
2 番目のオプションは、動的 SQL を使用することです。階層のレベルごとに 1 つの SELECT を作成し、レベルがなくなるまで UNION を追加し続けます。次に実行します。
関数を使用して CTE の機能を提供できますが、そうしないでください。関数は、別の列指向の目的を意図しており、コードはそれらの制約を受けます。これはスカラーであり、列の値を構築するのに適しています。ストアド プロシージャと CTE は行指向です。