問題タブ [recursive-cte]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
4227 参照

sql-server - SQL Server: 親子の選択

次のように設計されたProductCategoriesというテーブルを持つSQL Server 2008があります。

このテーブルから選択して、次のような結果セットを取得したいと思います。

私はこれを試しましたが、明らかにParentIdのないものが最初に表示されます:

できれば、私を助けてください:)

-- SQL を知らない男

0 投票する
4 に答える
2038 参照

sql-server - 再帰的な CTE 問題

基になるツリー構造を含むテーブルから述語式を作成するために、SQL Server で再帰 CTE を使用しようとしています。たとえば、私のテーブルは次のようになります。

...これは ((a > alpha) AND (b > beta)) OR ((c > gamma) AND (a < delta)) を表します。

ParentId は、親ノードの同じテーブル内の Id への参照です。

テーブルからこの文字列を構築するクエリを書きたいと思います。出来ますか?

ありがとう

0 投票する
1 に答える
2388 参照

sql - while ループのような再帰的な共通テーブル式を使用する

私は次の表を持っています

パラメータとして日付を指定すると、いいえを見つける必要があります。または、再帰 cte を使用して、開始日から 1 か月後まで毎日記録されたログの数。 一部の日にはログがない場合があるため、カウントを 0 として出力する必要があります。

元:

戻り値

2011 年 1 月 17 日を入力として、出力は次のようになります。

それを行うには再帰cteを使用する必要があります。再帰ごとに日付を1ずつ増やす方法と、再帰を停止/終了する方法がわかりません。

これは私がこれまでに行ったことです:

0 投票する
1 に答える
2063 参照

sql - 再帰 CTE が分析関数 (ROW_NUMBER) を手続き的に実行するのはなぜですか?

昨日、再帰的な CTE に回答したところ、これらが SQL Server に実装される方法に関する問題が明らかになりました (おそらく他の RDBMS でも?)。基本的にROW_NUMBER、現在の再帰レベルに対して使用しようとすると、現在の再帰レベルの各行サブセットに対して実行されます。これが真の SET ロジックで機能し、現在の再帰レベル全体に対して実行されることを期待します。

この MSDN の記事から、私が見つけた問題は意図された機能であると思われます。

CTE の再帰部分の分析関数と集計関数は、CTE のセットではなく、現在の再帰レベルのセットに適用されます。ROW_NUMBER などの関数は、現在の再帰レベルによって渡されたデータのサブセットに対してのみ動作し、 CTE の再帰部分に渡されたデータのセット全体に対しては動作しません。詳しくは、J. 再帰 CTE での分析関数の使用を参照してください。

私の掘り下げでは、なぜこれがそのように動作するように選択されたのかを説明する場所を見つけることができませんでした? これは、セットベースの言語での手続き型アプローチに近いため、SQL の思考プロセスに反して動作し、非常に混乱を招くと思います。再帰CTEが再帰レベルで手続き型の方法で分析関数を扱う理由を誰かが知っている、または誰かが説明できますか?


これを視覚化するのに役立つコードは次のとおりです。

RowNumberこれらのコード出力のそれぞれの列に注意してください。

これはCTEのSQLFiddleです(再帰の第2レベルのみを表示)

これは、CTEが行うことを期待する2番目のSQLFiddleです(問題を表示するには、2番目のレベルのみが必要です)

私は常に SQL 再帰 CTE がこの while ループのように実行されることを想定していました

0 投票する
4 に答える
2648 参照

postgresql - PostgreSQLは再帰CTEから関数にデータを渡します

次の問題があります: ソース ノード ( node_s ) からターゲット ノード ( node_t ) へのすべての可能なパスを検出しようとしています。

グラフ エッジを含む元のテーブルの形式は単純です。ノード_x | ノード_y | 強度 | ここで、"node_x" -> "node_y" は、エッジの強度が "重み" である直接エッジです。

パスの探索中の任意の時点で、その子の中のノードがターゲットnode_tを持っていることを発見した場合、このパスを記録し、このノードからのパスの探索を停止します。それ以外の場合は、探索を続行します。

簡単な解決策は、グラフの推移閉包を構築する PostgreSQL の再帰 CTE を使用することでした。

上記のコードは、ソース ノードnode_sから可能なすべてのパスを検出します。推移閉包の構築後にのみ、ソース ノードからターゲット ノードへの必要なパスの行を選択できます (最後の SELECT ステートメントを参照)。

例:

best_path テーブルには次のデータがあります。

クエリ:

ソース ノード = 1 からターゲット ノード = 4 へのパスを見つける

結果:

これは私が必要とするものではありません。ノード 2 からノード 4 (ターゲット) への直接エッジが既にあるため、パス 1.2.5.、1.2.4.8.、1.2.4.9.、1.2.5.10.、1.2.5.11. は必要ありません。ノード 2 の場合、2 から 4 へのパスが検出された時点で停止する必要があります。

要約すると、ノードが既にターゲット ノードへの直接エッジを持っている場合、ノードのパスを発見したくありません。これは、CTE の再帰的な用語で、次のような条件が必要であることを意味します。疑似コードは次のとおりです。

ソース ノード = 1 からターゲット ノード = 4 へのパスを検索するクエリの結果として、次のようにしたいと考えています。

よろしくお願いします。

私はすでに多くの方法を試しました。たとえば、FROM/WHERE 句の条件、CTE を関数に渡そうとしましたが、成功しませんでした。

任意の提案をいただければ幸いです。

私は自分が望むものを達成する独自の再帰関数を持っていますが、膨大な量のデータでは非常に遅くなります。PostgreSQL の CTE は最適化されているようですので、もう少し掘り下げてみたいと思います。

0 投票する
1 に答える
162 参照

sql-server-2008 - 再帰 CTE を使用して一致する子レコードを見つけることができません

次のテーブル @t があります。

ParentId = P1 を渡すと、目的の出力は x3 になります

つまり、停止条件はレコードに一致する最後の行であり、その sku 名を取得します

行。一致する行がない場合は、null を返します

私の試み(うまくいきません)

助けてください

0 投票する
1 に答える
176 参照

sql - WITHRECURSIVEを使用してすべての複合型コンポーネントタイプを検索します

複合型の場合、すべてのコンポーネント型の型を再帰的typnameに見つけるにはどうすればよいですか?oids

例:

oidsのメンバーのタイプを取得できますt_employee

しかし、私はそれを繰り返す必要があります、それは私が使用して行うことができると思いますWITH RECURSIVE

t_stationしかし、それは複合型の内部配列を見つけられません。

0 投票する
1 に答える
269 参照

sql - MSSQL から PL/pgSQL へのスクリプトの変換

EVE スタティック ダンプの作業を始めたところです。これは、ゲームに関するデータを含む多くのテーブルです。これには、私が扱っている太陽系が接続されているもののリストなどがあります。システムをフィルターで除外できる Web ページを作成したいと考えています。最初のステップは、近くにあるシステムのリストとそれらまでの距離を取得することです。

MSSQLでそれを行うスクリプトを見つけました

おそらく MSSQL バージョンのダンプを使用できることはわかっていますが、PostgreSQL をより適切に使用する方法についても学びたいと思っています。

私はそれが何をしているのか、そしてすべてを理解していますが、PL/pgSQL を機能させるのに十分なほど理解していません。

私の試みは

そして、生成されるエラーは

すべての助けをありがとう。

0 投票する
1 に答える
3334 参照

sql - 再帰クエリの数値オーバーフロー: Teradata

私はテラデータが初めてです。以下のように作成した table に 1 から 1000 までの数字を挿入したいと思いtest_seqます。

このサイトで検索した後、数字を挿入するための再帰クエリを思いつきました。

test_dual次のように作成され、単一の値のみが含まれます。(Oracle の DUAL のようなもの)

しかし、挿入ステートメントを実行すると、エラーが発生します。Failure 2616 Numeric overflow occurred during computation.

ここで何が間違っていましたか?integer数値 1000 を保持するのに十分なデータ型ではありませんか? また、テーブルを廃止できるようにクエリを作成する方法はありtest_dualますか?