[解決済み] SQLの結合形式 - 入れ子になった内側join
2022-03-13 18:44:41
質問
私がリファクタリングしているレガシーシステムに、以下のようなSQL文があります。この質問の目的のために省略したビューで、当面はcount(*)を返すだけです。
SELECT COUNT(*)
FROM Table1
INNER JOIN Table2
INNER JOIN Table3 ON Table2.Key = Table3.Key AND Table2.Key2 = Table3.Key2
ON Table1.DifferentKey = Table3.DifferentKey
非常に多くのレコードを生成し、システムを殺しているのですが、どなたか構文を説明していただけませんか?また、これは何か他の方法で表現できるのでしょうか?
- テーブル1には419行が含まれる
- テーブル2には3374行が含まれる
- テーブル3は28182行を含む
EDIT
再フォーマットの提案
SELECT COUNT(*)
FROM Table1
INNER JOIN Table3
ON Table1.DifferentKey = Table3.DifferentKey
INNER JOIN Table2
ON Table2.Key = Table3.Key AND Table2.Key2 = Table3.Key2
解決方法は?
読みやすくするために、クエリを再構築しました...見かけ上の最上位はテーブル1で、次にテーブル3が結びつき、テーブル3はテーブル2に結びつきます。 関係の連鎖をたどれば、ずっと簡単です。
さて、質問にお答えします。 デカルト積の結果、大きなカウントが得られていますね。 Table1のレコードがTable3でマッチするごとにX * Yが得られ、Table3とTable2がマッチするごとに同じ影響があります... Y * Z... したがって、テーブル1の1つの可能なIDに対する結果は、X * Y * Zのレコードを持つことができます。
これは、テーブルの正規化または内容がどのようになっているのか、キーがPRIMARYキーなのかそうでないのかがわからないことに基づいています。
Ex:
Table 1
DiffKey Other Val
1 X
1 Y
1 Z
Table 3
DiffKey Key Key2 Tbl3 Other
1 2 6 V
1 2 6 X
1 2 6 Y
1 2 6 Z
Table 2
Key Key2 Other Val
2 6 a
2 6 b
2 6 c
2 6 d
2 6 e
つまり、テーブル1とテーブル3を結合すると、(このシナリオでは)12レコード(1の各レコードと3の各レコードを結合したもの)になります。 そして、テーブル2のマッチしたレコード(5レコード)をすべてもう一度...合計60(3 tbl1 * 4 tbl3 * 5 tbl2)カウントが返されます。
さて、これを1000件以上のレコードに展開すると、いかに混乱した構造が牛の首を絞め、パフォーマンスを低下させるかがわかるでしょう。
SELECT
COUNT(*)
FROM
Table1
INNER JOIN Table3
ON Table1.DifferentKey = Table3.DifferentKey
INNER JOIN Table2
ON Table3.Key =Table2.Key
AND Table3.Key2 = Table2.Key2
関連
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQL ServerにおけるLEFT JOINとLEFT OUTER JOINの比較
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] SQL ServerでJOINを使用してUPDATE文を実行するにはどうすればよいですか?
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] SQLサーバーで行を列に効率的に変換する
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SQLラーニングノート--オペランドには1つのカラムが必要です。
-
[解決済み] SQLの結合形式 - 入れ子になった内側join
-
[解決済み] MySQLの「スキーマの作成」と「データベースの作成」 - 違いはあるのか?
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] UNIONとUNION ALLの違いは何ですか?
-
[解決済み] 複数の列でgroup byを使用する
-
[解決済み] SQL Server - 挿入された行のIDを取得するための最良の方法は?
-
[解決済み] SQL Serverでシングルクォートをエスケープするにはどうすればよいですか?
-
[解決済み] Count()で条件を指定することは可能ですか?
-
[解決済み] SQL ServerでGROUP BYを使って文字列を連結する方法とは?