タグ付けされた質問 「recursive」

再帰を使用してデータベースの問題を解決します。

2
再帰共通テーブル式でEXCEPTを使用する
次のクエリが無限行を返すのはなぜですか?EXCEPT句が再帰を終了すると予想していました。 with cte as ( select * from ( values(1),(2),(3),(4),(5) ) v (a) ) ,r as ( select a from cte where a in (1,2,3) union all select a from ( select a from cte except select a from r ) x ) select a from r Stack Overflow に関する質問に答えようとしているときに、私はこれに出会いました。

4
SQL再帰は実際にどのように機能しますか?
他のプログラミング言語からSQLに移行すると、再帰クエリの構造はかなり奇妙に見えます。一歩ずつ歩いていくと、バラバラになっているようです。 次の簡単な例を考えてみましょう。 CREATE TABLE #NUMS (N BIGINT); INSERT INTO #NUMS VALUES (3), (5), (7); WITH R AS ( SELECT N FROM #NUMS UNION ALL SELECT N*N AS N FROM R WHERE N*N < 10000000 ) SELECT N FROM R ORDER BY N; それを見てみましょう。 最初に、アンカーメンバーが実行され、結果セットがRに格納されます。したがって、Rは{3、5、7}に初期化されます。 次に、実行はUNION ALLを下回り、再帰メンバーが初めて実行されます。Rで実行されます(つまり、現在手元にあるRで実行されます:{3、5、7})。この結果は{9、25、49}になります。 この新しい結果はどうなりますか?既存の{3、5、7}に{9、25、49}を追加し、結果のユニオンRにラベルを付け、そこから再帰を続行しますか?または、Rをこの新しい結果{9、25、49}のみに再定義し、後ですべての結合を行いますか? どちらの選択も意味がありません。 Rが{3、5、7、9、25、49}であり、再帰の次の反復を実行すると、{9、25、49、81、625、2401}になり、 {3、5、7}を失った。 …

5
行間で90日が経過したギャップを再帰的に見つける方法
これは私のC#ホームワールドでは一種の些細な作業ですが、SQLでまだ作成しておらず、セットベース(カーソルなし)で解決することを好みます。結果セットは、このようなクエリから取得する必要があります。 SELECT SomeId, MyDate, dbo.udfLastHitRecursive(param1, param2, MyDate) as 'Qualifying' FROM T どのように機能するか これら3つのパラメーターをUDFに送信します。 UDFは内部的にparamsを使用して、ビューから関連する90日未満の古い行をフェッチします。 UDFは 'MyDate'をトラバースし、合計計算に含める必要がある場合は1を返します。 そうでない場合は、0を返します。ここでは「修飾」と名付けられています。 UDFが行うこと 行を日付順にリストします。行間の日数を計算します。結果セットの最初の行はデフォルトでHit = 1になります。差が最大90の場合、-ギャップの合計が90日になるまで次の行に渡します(90日目が経過する必要があります)。代わりに、結果から行を省略することもできます。 |(column by udf, which not work yet) Date Calc_date MaxDiff | Qualifying 2014-01-01 11:00 2014-01-01 0 | 1 2014-01-03 10:00 2014-01-01 2 | 0 2014-01-04 09:30 2014-01-03 1 | …

2
すべての子供の合計を見つける再帰的CTE
これは、再帰T-SQLクエリ(おそらくCTE)を使用して検索したいアセンブリツリーです。以下の結果が期待されます。任意の部品について、アセンブリごとの合計金額を知りたい。 つまり、「Rivet」を検索すると、直接の子の数だけでなく、アセンブリ内の各レベルの合計数を知りたいのです。 Assembly (id:1) | |-Rivet |-Rivet |-SubAssembly (id:2) | | | |-Rivet | |-Bolt | |-Bolt | |-SubSubAssembly (id:3) | | | |-Rivet | |-Rivet | |-SubAssembly (id:4) |-Rivet |-Bolt DESIRED Results ------- ID, Count 1 , 6 2 , 3 3 , 2 4 , 1 現在、直接の親を取得できますが、CTEを拡張してこの情報を上にロールアップできるようにする方法を知りたいです。 With …

2
PostgreSQLの再帰的な子孫の深さ
祖先の子孫の深さを計算する必要があります。レコードにがある場合、レコードはobject_id = parent_id = ancestor_idルートノード(祖先)と見なされます。WITH RECURSIVEPostgreSQL 9.4でクエリを実行しようとしています。 データや列を制御しません。データおよびテーブルスキーマは外部ソースから取得されます。テーブルは継続的に成長しています。現在、1日あたり約3万件の記録があります。ツリー内のノードは欠落している可能性があり、ある時点で外部ソースからプルされます。彼らは通常引き込まれますcreated_at DESC順番にますが、データは非同期のバックグラウンドジョブでプルされます。 最初はこの問題に対するコードソリューションがありましたが、現在は500万行以上あり、完了するまでに約30分かかります。 テーブル定義とテストデータの例: CREATE TABLE objects ( id serial NOT NULL PRIMARY KEY, customer_id integer NOT NULL, object_id integer NOT NULL, parent_id integer, ancestor_id integer, generation integer NOT NULL DEFAULT 0 ); INSERT INTO objects(id, customer_id , object_id, parent_id, ancestor_id, generation) VALUES …

1
SQL Server監査データからスカラー値のユーザー定義関数の使用を除外する方法
データベースに対するすべての実行アクションを監査するデータベース監査仕様を持つSQL Serverデータベースがあります。 CREATE DATABASE AUDIT SPECIFICATION [dbAudit] FOR SERVER AUDIT [servAudit] ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public]) 一部のクエリは、結果セットのすべての行に対してスカラー関数の使用を監査ログに書き込むことがわかっています。これが発生すると、ログがETLで最終的な休憩場所に達する前にログがいっぱいになり、ログにギャップが生じます。 残念ながら、コンプライアンス上の理由により、すべてのEXECUTEステートメントの監査を停止することはできません。 この問題へのアプローチについて最初に考えたのはWHERE、サーバー監査の句を使用してアクティビティを除外することです。コードは次のようになりました。 WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' ) 残念ながら、SQL ServerはリレーショナルIN演算子を許可しません(おそらく、監査ログに書き込む必要があるたびにクエリを実行したくないためです)。 私たちは、どのハードコードストアドプロシージャ書き込みを避けたいobject_idにWHERE句が、それは、この問題にアプローチする最良の方法で私たちの現在の考え方です。考慮すべき代替アプローチはありますか? 再帰CTEでスカラー関数が使用されている場合、結果セット内のすべての行の監査ログにクエリが書き込まれることに気付きました。 ベンダーが提供するいくつかのスカラー値関数がありますが、それらを削除したり、代替データベースに移動したりすることはできません。

1
再帰クエリの結果をツリーのように展開してソートするにはどうすればよいですか?
あなたが持っていると仮定しましょう nodesようなテーブル。 CREATE TABLE nodes ( node serial PRIMARY KEY, parent integer NULL REFERENCES nodes(node), ts timestamp NOT NULL DEFAULT now() ); これは、最上位にルートノードがあり、ルートノードまたは他の子ノードからぶら下がっているいくつかの子ノードを持つ、標準的なノードのようなツリー構造を表します。 いくつかのサンプル値を挿入しましょう: INSERT INTO nodes (parent) VALUES (NULL), (NULL), (NULL), (NULL), (1), (1), (1), (1), (6), (1) , (6), (9), (6), (6), (3), (3), (3), (15); 次に、深さ4までの最初の10個のルートノードとそのすべての子を取得します。 WITH …

3
maxrecursionのシステム全体のデフォルトを変更する
システム全体のデフォルト値の変更方法を教えてくださいMAXRECURSION。 デフォルトでは100ですが、1000などに増やす必要があります。 クエリを取得して実行するプログラムを使用しているため、クエリヒントを使用できません。残念ながら、この制限を回避することはできません。 ただし、サーバーインスタンスの管理者権限は持っています。サーバーファセットをざっと見てきましたが、クエリオプションや再帰に関連するものは何もありません。私はそこに想定している私は、システム全体のデフォルトを更新することができる場所のどこかにあることを。 何か案は?

2
概念的なERDマルチテーブル多対多、またはおそらく再帰?
概念図を作成しています[そうです、属性とキーが含まれていることは知っていますが、これは、学習中に行っていることを統合するためだけのものです]-したがって、関係と図表の方法ではなく表;) 私の心のハードルは次のとおりです。 私は、プロファイル、場所、および組織の関係をモデル化する最良の方法を確認しようとしています。 まず、ルール: 1つ以上のプロファイルは、1つ以上の組織のメンバー/友達になることができます。およびその逆。 1つまたは複数のプロフィールを他のプロフィールのメンバー/友達にすることができます。 1つ以上の組織が他の組織のメンバー/フレンドになることができます。 FriendとMemberは異なります。Friendsは読み取り専用のようなものであり、[レベルに応じて]メンバーは変更するためのフルアクセス権を持っています。 さらに複雑なことに、ロケーションには独自の「さらに」洗練されたルールのセットがあります。たとえば、組織は2つのロケーションを所有しますが、ロケーションルールによっては、その組織のメンバー[ プロファイル ]が1つのロケーションでフルアクセスできますが、その他。[申し訳ありませんが、表示サイズを上げるには、別のウィンドウで画像を開く必要があります。] ご覧のように、プロファイルと組織の概念はほとんど同じです。これは、モデル化されていない友達とメンバーの概念です。[...オーナー/レコード内の管理者/メンバー/友達など]。したがって、なぜ私は次の概念を考えているのですか? 上の画像のOption.2を参照してください。これは、現在の組織とOrganization_Locationsテーブルとそれらの関係を削除し、プロファイルとのやや再帰的な関係としてOption.2組織テーブルに置き換えます。 問題の核心は、私が多態性をプログラム的に気にしすぎて、単純さと柔軟性を損ない、プロセスで完全に混乱しているのかどうかだと思います;) 事前にあなたの考えをありがとう、大いに感謝-M :)。 改訂された図: MDCCLの質問への回答: はい、プロフィールは1人の人物で構成され、同じ意味を持っています-あなたの理論的根拠が向かっているところに-私はあなたが正しいと信じています:組織と人物はプロフィールのサブタイプである可能性があります。したがって、プロファイルは1人または1つの組織で構成されます。 プロファイルごとに1つのメールアドレス。 はい。上記のように、組織には少なくともメールアドレスが必要です。 正しい、1つの固定アドレス。 それは可能性ですが、まれです-私が学んでいることから-したがって、将来の寿命などのためにそのようなモデルを作成する必要があります。したがって、確認のために、ロケーションは複数の人が所有することができます。 場所は間違いなく他のほとんどの間の不可欠なエンティティです。おそらく私はここで簡潔に何ができるかを明確にし、次にこの質問への有益な追加にうまくいけば私の他の答えを最初に読んでみましょう[ そして最後に#6への私の答えを見てください ];)Re:役割の所有者 An **Organization** can be an Owner of zero or more **Locations**. A Person can be an owner of zero of more Locations[したがって、以前に推測したとおり。簡単に言えば、プロファイルは0個以上のロケーションの所有者になることができます。 はい、ロケーションの所有者であるプロファイルは、すべてのロール権限[スーパーユーザー]を想定しています。プロファイルで管理者は、特定の細部修正できる場所が、主に他のすべてを介して供給された詳細/データ編集/助けプロファイルを/ S …

2
パラメータ付きのこの再帰的CTEがリテラルで行うとき、なぜインデックスを使用しないのですか?
ツリー構造で再帰CTEを使用して、ツリー内の特定のノードのすべての子孫をリストしています。WHERE句にリテラルノード値を書き込むと、SQL Serverは実際にその値にのみCTEを適用し、実際の行数が少ないクエリプランなどを提供します。 ただし、値をパラメーターとして渡すと、CTEが実現(スプール)され、事実の後でフィルター処理されるようです。 私は計画を間違って読んでいた可能性があります。パフォーマンスの問題には気づきませんでしたが、CTEの実現により、特にビジーなシステムでは、より大きなデータセットで問題が発生する可能性があると心配しています。また、私は通常、このトラバーサルをそれ自体で複合します。祖先までトラバースし、子孫まで戻ります(すべての関連ノードを確実に収集するため)。私のデータが原因で、「関連」ノードの各セットはかなり小さいため、CTEの実現は意味がありません。また、SQL ServerがCTEを実現しているように見える場合、その「実際の」数には非常に多くの数値が含まれています。 クエリのパラメーター化されたバージョンをリテラルバージョンのように機能させる方法はありますか?CTEを再利用可能なビューにしたいと考えています。 リテラルを使用したクエリ: CREATE PROCEDURE #c AS BEGIN; WITH descendants AS (SELECT t.ParentId Id ,t.Id DescendantId FROM #tree t WHERE t.ParentId IS NOT NULL UNION ALL SELECT d.Id ,t.Id DescendantId FROM descendants d JOIN #tree t ON d.DescendantId = t.ParentId) SELECT d.* FROM descendants d WHERE …

2
プログラムでテーブルを結合するために必要なすべての結合を見つける
SourceTableとTargetTableを指定して、すべての結合が必要な文字列をプログラムで作成します。 要するに、私はこのような文字列を作成する方法を見つけようとしています: FROM SourceTable t JOIN IntermediateTable t1 on t1.keycolumn = t.keycolumn JOIN TargetTable t2 on t2.keycolumn = t1.keycolumn 特定のテーブルのすべての外部キーを返すクエリがありますが、これをすべて再帰的に実行して最適な結合パスを見つけ、文字列を作成しようとすると、制限が生じます。 SELECT p.name AS ParentTable ,pc.name AS ParentColumn ,r.name AS ChildTable ,rc.name AS ChildColumn FROM sys.foreign_key_columns fk JOIN sys.columns pc ON pc.object_id = fk.parent_object_id AND pc.column_id = fk.parent_column_id JOIN sys.columns rc …

1
再帰的なCTEパフォーマンス
再帰的なCTEパフォーマンスのヘルプが必要です。CTE以下では、階層データを再帰的にプルしようとしているため、実行速度が非常に遅くなっています。テーブルは大きく、すべてのルートIDに最大3つの再帰的なアイテムIDがあります。約200000以上のルートIDが存在する可能性があります。アンカーのすべてのrootidは再帰的にitemidになるため、再帰的なCTEは巨大なデータセットでは遅いことを知っています。 スキーマ: Create table RootItem (ItemId int primary key, RootIt int , insertdate datetime) 上記の表には100万行を超える行があります。 CTEクエリ: ; With rootcte as ( select itemid from RootItem where rootid is null union all select r.itemid as RootId , i.itemid from RootItem i join rootcte r on i.rootid = r.itemid ) テーブルスキーマを変更してheirarchyidを使用することはできません。whileループも試しましたが、それも遅いです。 このクエリを最適化できる他の方法はありますか? …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.