問題タブ [connect-by]

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 に答える
3210 参照

sql - 階層クエリで「最も深い」子を見つける

階層データのクエリについてサポートが必要です。これは単一の単純なテーブルであり、ルートエントリの場合はnullになる可能性がありますparent_idid

テーブル内の各レコードについて、最大IDを持つ最も深い子を見つける必要があります。レコードに子がない場合は、独自のIDを返す必要があります。私は自分で試しましたがSTART WITH A.id = B.id、AとBがサブクエリである場合は使用できませんでした。これは、Oracleがそのような結合を許可していないようです。

サンプルデータは次のとおりです。

およびサンプル結果

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

sql - 列間でデータを切り替える

次のコード例を見てください。

戻り値:

次のように、各レコードの以前の値を含む新しい列を作成できればと思います。

connect_by ステートメントで常に迷子になりますが、これは十分に単純に思えます。

誰かが助けることができますか?

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

oracle - 以前のオラクルで接続

階層要素を含むテーブルがあります

テーブル :

B は同じテーブルからの外部キーです

クエリは次のとおりです。

結果

なぜ「2 C2」が現れるのですか?

正しい結果ではありませんが、望ましい結果は次のとおりです。

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

oracle - 複数の可能な列一致でのOracle Self-Join - CONNECT BY?

---- からのクエリ要件があります。で解決しようとしてCONNECT BYいますが、必要な結果が得られないようです。


表 (簡略化):

ユーザー データのソース (データ フィード) は 2 つあります。情報を更新するときは、どちらかの間違いに注意する必要があります。


シナリオ:

  1. ユーザーには新しいユーザー ID が与えられます...古いレコードはそれに応じて設定され、非アクティブ化されます (通常、フルタイムになる請負業者の名前が変更されます)。
  2. ユーザーが離れてしばらくしてから戻ってきます。アカウントを接続できるように、HR は古いユーザー ID を送信できませんでした。
  3. システムがおかしくなり、古いレコードに新しいユーザー ID が設定されませんでした。
  4. データは他の何百もの点で悪い可能性があります


以下が同じユーザーであることを知る必要があり、名前やその他のフィールドに頼ることはできません...それらは一致するレコード間で異なります:


EXOT1100フィールドでEX000005適切に接続されていNEW_USER_IDます。名前の変更は、グローバル HR ID が存在する前に行われたため、グローバル HR ID はありEX0T1100ません。 EX000005には新しいユーザー ID 'GL110456' が与えられ、この 2 つは同じグローバル HR ID を持つことによってのみ接続されます。

データのクリーンアップはオプションではありません。


これまでのクエリ:


さまざまな句を試しましCONNECT BYたが、どれもまったく正しくありません。


UNIONing 2 つの CONNECT BY クエリが機能しません... レベリングができません。

これが私が見たいものです...区別してサブクエリとして使用する必要がある結果セットで問題ありません。また、ROOTUSER 列の 3 つのユーザー ID のいずれでも問題ありません...それらが同じユーザーであることを知る必要があるだけです。


アイデア?


アップデート

ニコラス、あなたのコードは正しいトラックに非常によく似ています... 現時点では、が nulllead(user_id) over (partition by global_hr_id)の場合に誤ったヒットが発生します。global_hr_id例えば:

null をパーティション内の個別のレコードとして扱いたいと思ったことはよくありますが、うまくいく方法が見つかりませんでしたignore nulls。これは私が望んでいたことをしました:

...しかし、もっと良い方法があるはずです。本格的なユーザー データ (約 40,000 ユーザー) では、まだクエリを完了できていません。global_hr_idとの両方new_user_idが索引付けされています。


アップデート

クエリは約 750 秒後に返されます...長いですが、扱いやすいです。ルートからレベル 2 のヒットをフィルタリングする良い方法がないため、93k レコードが返されますstart with global_hr_id is null。それらをどのように除外するかについて、もう少し考えなければなりません。

以前より複雑な start with 句を追加しようとしましたが、別々に実行すると < 1 秒... 一緒にすると 90 分かかります >.<

助けてくれてありがとう。

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

oracle - オラクルでコミット時にリフレッシュしてマテリアライズドビューとして階層クエリを作成する方法

Oracle 10gでREFRESH ON COMMITを使用してマテリアライズドビューとして階層クエリを作成する可能性があるかどうか教えてください。

CONNECT_BY を使用してみましたが、これは REFRESH ON COMMIT では機能しません。

基になるデータが変更されたときにビューを自動的に更新する他の可能性はありますか?

または、REFRESH ON COMMIT で動作する CONNECT_BY に代わるものがあるのでしょうか?

ヒントやヘルプを事前にありがとう。

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

sql - 割り当ての開始と終了の識別Oracle sql 10g

これは、私がすでに尋ねた (そして回答した) ここでの質問と非常によく似ています:対象期間の開始と終了の識別 - oracle 10g sql

ただし、この場合に必要なものを達成する方法を見つけることができませんでした。次のようなデータがあります。

終了コード「A」はケースが再割り当てされたことを意味し、「J」はケースがクローズされたことを意味します。次のようなデータが必要です。

すでに述べたように、これは以前に尋ねた質問と非常によく似ていますが、その場合、利用できる開始コードがありました。割り当ての開始日を特定する必要があると思います。それは、「J」コードを持つ割り当てに続く最初の日付か、最初の日付のいずれかですが、少し苦労しています。アドバイスをいただければ幸いです。参考までに、私のオラクルのバージョンは 10g、10.2.0.5.0 です。

編集: @Dazzal から提供された元のクエリに回答した回答を受け入れましたが、@Gordon Linoff の回答に基づいて新しい質問を投稿しました。これは私のニーズにより適していると思います。 https://stackoverflow.com/questions/13383560/grouping-data-oracle-sql-based-on-sum

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

sql - テーブルのCONNECTBYLEVELが余分な行を返すのはなぜですか?

CONNECT BY LEVELを使用すると、テーブルで実行すると返される行が多すぎるようです。起こっていることの背後にある論理は何ですか?

次の表を想定します。

このクエリは12行を返します(SQL Fiddle)。

テーブルAの各行に1つの行があり、列LVLの値は1であり、テーブルAの各行に3つあり、列LVLは2です。

これは、同じ結果を返すこのクエリと同等です。

ID列の各値に対して、これらのクエリが12行を返す理由、またはLVLが2の行が3つあり、LVLが1の行が1つしかない理由がわかりません。

「接続」されているレベルの数を3に増やすと、IDの値ごとに13行が返されます。1(LVLが1の場合)、3(LVLが2の場合)、および9(LVLが3の場合)。これは、返される行が、LVLの値から1を引いた値の表Aの行数であることを示しているようです。

ただし、これらのクエリは次のクエリと同じで、6行が返されます。

何が起こるべきかを説明する上で、ドキュメントは私には特に明確ではありません。これらの力で何が起こっているのか、そしてなぜ最初の2つのクエリが3番目のクエリと同じではないのですか?

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

sql - 子、親、および兄弟をプルするための階層クエリの必要性

データをプルできるようになりましたが、大規模なデータ セットのクエリを最適化するためのより良い方法があるかどうか疑問に思っています。

http://sqlfiddle.com/#!4/0ef0c/5

したがって、基本的には、特定の組織 ID をクエリに提供し、その親、子、兄弟、および叔母と叔父を再帰的にプルできるようにしたいと考えています。次に、その組織階層に関連付けられているアクティビティをプルします。

Org1 は最上位の組織ですが、null の親を持つ場合と持たない場合があります。

基本的に、子と親をプルするために上下のクエリを実行していましたが、別のクエリを追加することによってのみ兄弟を取得できるようです。最終的に友人の助けを借りて別のクエリにたどり着きましたが、大規模なデータ セット (4 ~ 5k のアクティビティ) が非常に少ないです。

どんな洞察も大歓迎です。

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

sql - 親が所有するルートのパーセンテージを計算します

簡単に言えば、ツリーのさらに上の親が所有するツリーのルートのパーセンテージを計算しようとしています。SQL だけでこれを行うにはどうすればよいですか?

これが私の(サンプル)スキーマです。階層自体は非常に単純ですが、追加の があることに注意してくださいholding_id。これは、単一の親が子のさまざまな部分を「所有」できることを意味します。

そしていくつかのサンプルデータ:

SQL フィドル

次のクエリは、実行したい計算を返します。SYS_CONNECT_BY_PATH の性質上、私の知る限り、計算自体を実行することはできません。

この例ではありませんが、データには周期的な関係があります。

現時点では、非常に単純な関数を使用して、列の文字列calcを数値に変換します

これはばかげた方法のように思われ、動的 SQL 1の解析にかかる追加の時間を避けたいと思います。

理論的には、MODEL 句を使用してこれを計算できるはずです。私の問題は、ツリーの非一意性が原因です。これを行うために MODEL 句を使用する私の試みの1つは次のとおりです。

当然のことながら、これは次の場合に失敗します。

ORA-32638: MODELディメンションのアドレス指定が一意ではありません

UNIQUE SINGLE REFERENCEの使用は、同様の理由で失敗します。つまり、ORDER BY 句が一意ではないということです。

tl;dr

SQL のみを使用して、親が所有するツリーのルートのパーセンテージを計算する簡単な方法はありますか? MODEL で正しい軌道に乗っている場合、どこで間違っているのでしょうか?

1. PL/SQL SQL コンテキスト スイッチも避けたいと思います。これはほんのわずかな時間であることはわかっていますが、1 日に数分追加せずにすばやく行うのは非常に困難です。

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

sql - SQLを使用して番号範囲間の後続の番号を生成する

私は以下を含むテーブルを持っています:

Oracle 11gを使用した1つのクエリで、次の結果を取得したいと思います。この結果では、で定義された範囲内に存在する一意の番号をそれぞれリストしています。

 

私はconnectby&model句で遊んでいますが、これまでのところ成功していません。

あなたの助けのためのtx