問題タブ [self-join]

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 投票する
1 に答える
772 参照

sql - すべて同じテーブル上の 3 つのレベルでの 1 対多の結合

ページを含むこのテーブルがあります。これらのページには、同じテーブル内のページでもある親があります。

この例では、テーブルは次のようになります。

私の質問は、次のようなメニュー構造を作成するときに SQL がどのように見えるかです。

私は現在これを持っています:

しかし、それは私が望む出力をほとんど作成せず、完全に間違った方法で行っていると思います...

編集:

これは私が現在持っているものです:

最初の再帰は機能しているように見えますが、2回目は機能していないようです。

結果:

0 投票する
5 に答える
474803 参照

sql - SELF JOINとは何ですか?いつ使用しますか?

セルフジョインとは何ですか?いつ使用しますか?自己結合がわからないので、例を挙げた素人の説明がいいと思います。

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

c# - Subsonic : Self Join 、テーブル エイリアス

サブソニックで自己結合を実行する方法はありますか?

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

mysql - EAV ベースの在庫管理アプリケーションの MySQL 自己結合

この質問は、在庫管理アプリケーションに関する最初の質問で提案したスキーマに関連しています。

特定のアイテムの現在の在庫を提供する MySQL クエリを作成しようとしています。

クエリは機能していますが、必要な情報を取得するためのより効率的な方法があるかどうか疑問に思いました。

これは、次の行に沿って何かを返します

非常に厄介なように見えますが、私の貧弱な脳は、より良いものを思いつくことができません.

助言がありますか?

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

mysql - mysql 再帰的自己結合

distinct単一の自己結合を使用して、「X」に含まれるすべての値を見つけることはできますか?

EDIT

同様に、X には A、B、および C が含まれます A には P が含まれます P には Q が含まれます Q には R が含まれます R には Y が含まれます Y には C、D、および E が含まれます...

したがって、X を照会するときに、A、B、C、D、E、P、Q、R、Y を表示したいと考えています。

EDIT

プログラミングで正解。

ただし、同じテーブルとフィールドではありません。しかし、私はあなたが概念を理解してくれることを願っています。みんなありがとう。

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

mysql - MYSQL:自己結合時にレコードを繰り返すデカルト積を回避する

テーブルAとテーブルBの2つのテーブルがあります。これらは同じ列を持ち、データは実質的に同じです。どちらも自動インクリメントされたIDを持っていますが、2つの違いは、同じレコードに対して異なるIDを持っていることだけです。

列の中には、一意ではないIDENTIFIER列があります。つまり、両方のテーブルに同じIDENTIFIERを持つレコードが(非常に少数)あります。

ここで、テーブルAのIDとテーブルBのIDの間の対応を見つけるために、次のようにIDENTIFIER列でこれら2つのテーブルを結合する必要があります(すべての目的で自己結合です)。

しかし、IDENTIFIERは一意ではないため、IDENTIFIERの繰り返し値の可能なすべての組み合わせが生成されるため、これは望ましくありません。

理想的には、IDENTIFIER値が繰り返されるID間で、その順序に基づいて1対1の関連付けを生成したいと思います。たとえば、テーブルA(したがってテーブルB)に異なるIDと同じIDENTIFIER値を持つ6つのレコードがあるとします。

それが理想的です。とにかく、IDの順序に関係なく、1対1の関連付けを生成する方法は、引き続き問題ありません(ただし、推奨されません)。

御時間ありがとうございます、

シルヴィオ

0 投票する
3 に答える
278 参照

mysql - MySQL のアプローチ: 値を設定するための大規模な自己結合?

姓、住所、性別、生年月日のフィールドを持つ 1200 万レコードの MyISAM テーブルを使用しています。

姓、日付、および住所フィールドは索引付けされます。私の目標は、次の基準で定義された推定婚姻状況のフィールドを追加することです: 各レコードについて、(1) 同一の姓、(2) 異なる性別、(3) 同一の住所を持つ別のレコードがテーブルに存在する場合、および (4) 年齢差が 15 歳未満の場合、既婚 = T と設定します。そうでなければ既婚に設定= F.

SQL の初心者である私の最初のアプローチは、デフォルトで 'F' に設定されている marital フィールドを追加し、次に自己結合を使用して MARRIED = T を設定することでした。

これは小さなテーブルでは問題なく機能しますが、1,200 万行のテーブルでこのプロセスが完了する前に引退する可能性が高いことがすぐにわかりました。私の SQL の知識は非常に限られているため、これは次善のアプローチであると確信しています。提案された代替案はありますか?おそらくSURNAME + ADDRESS + CITYの索引付けですか?最初に ADDRESS + CITY でグループ化しますか? より良いテーブルデザイン? 任意の提案をいただければ幸いです。

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

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

mysql - クレイジーな複数の自己結合を含む MySQL

非常に遅いネストされた選択を使用する古いコードを置き換えるプロセスの一環として、次のようなクエリになりました。

したがって、最も内側の結合で、 のレコードのサブセットと関係があるtable_r(copy )のレコードを探しています。r1table_d

次の結合では、メイン インデックス ( table_r)が前の結合からのレコードの親インデックス ( ) と一致する( )の 2 番目のコピーでレコードを探しています。r2r_idparent_id

次に、 ( )LEFT JOINの 3 番目のコピーを使用して、前の結合のと単純に一致させようとしています。この最も外側の結合の考え方は、 からすべてのレコードを取得することですが、さらに条件 (まだクエリには含まれていません) を使用して selectと同等のことを行い、 のどのレコードが を持っているかを判断します。table_rr3r_idr_idtable_rNOT INr3NULLsr2_id

問題は、LEFT JOINが の全体を提供していないことですtable_r。最終的な結合なしで取得したのと同じレコードのサブセット、つまり . と同じものを提供していINNER JOINます。したがって、1208 レコードを期待しているのに対し、508 になります。

私はここで何かおかしなことをしているに違いないことを知っています...

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

ruby-on-rails - ActiveRecord を使用したテーブルでの自己結合

Nameさまざまな名前を含むActiveRecord という名前がありますLanguages

1 つの言語で名前を見つけるのは簡単です。

しかし、言語 1 と言語 2 の両方が同じ名前を持つ一致するペアを見つける必要があります。SQL では、これは単純な自己結合を呼び出します。

ActiveRecord でこのようなクエリを実行するにはどうすればよいですか? たまたま何かと一致する言語 1 の名前のリストだけでなく、名前のペア (= 一致の両側) を見つける必要があることに注意してください。

ボーナス ポイントについては、フィールドに SQL ワイルドカードが含まれている可能性があるためn1.normalized=n2.normalized、に置き換えます。n1.normalized LIKE n2.normalized

また、データを別の方法でモデル化するというアイデアにもオープンですが、できれば言語ごとに別々のテーブルを用意することは避けたいと思っています。

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

sql-server-2008 - SQL Server 2008 ISNULL ステートメントを使用した FULL JOIN の最適化

こんにちは、みんな

定期的に実行しなければならないクエリを改善するのを誰かが手伝ってくれることを望んでいました。現時点では、実行に 40 分以上かかります。この間、割り当てられたメモリをすべて使用しますが、CPU 使用率はほとんど 2% から 5% で蛇行し、数秒間 40% に跳ね上がることがあります。

私はこのテーブルを持っています(簡略化された例):

入力値の一部を次に示します。

各エントリには dteEffectiveDate フィールドがあります。さらに、それぞれに dtePrevious と dteNext があり、最も近い前/次の発効日の日付が反映されます。今私が欲しいのは、特定の年齢内の連続する期間の間の Count フィールドの中間値を計算するクエリです。

たとえば、上記のデータでは、40 歳の場合、2009/01/01 では 300、2010/01/01 では 200 であるため、クエリは 250 を生成する必要があります。

30 歳のエントリは 10 だけであることに注意してください。これは 2009/01/01 です。2010/01/01 には記載がありませんが、この時点でデータが取得されていることがわかっているため、何もないということは、この日付で 30 が 0 であることを意味します。したがって、クエリは 5 を生成する必要があります。

これを実現するために、テーブル自体の FULL JOIN を使用し、ISNULL を使用して値を選択します。これが私のコードです:

出力:

完全に機能しますが、約 7m のレコードである実際のデータに対してこれを実行すると、実行に非常に時間がかかります。

誰か提案はありますか?

ありがとう
カール