[解決済み】SQLで結合順は重要か?
質問
パフォーマンスを無視して、以下のクエリ A と B で同じ結果が得られるでしょうか?CとDはどうでしょうか?
-- A
select *
from a left join b
on <blahblah>
left join c
on <blahblan>
-- B
select *
from a left join c
on <blahblah>
left join b
on <blahblan>
-- C
select *
from a join b
on <blahblah>
join c
on <blahblan>
-- D
select *
from a join c
on <blahblah>
join b
on <blahblan>
解決方法は?
対象
INNER
の結合では、順序は重要ではありません。クエリは同じ結果を返しますが、selects を
SELECT *
から
SELECT a.*, b.*, c.*
.
の場合 (
LEFT
,
RIGHT
または
FULL
)
OUTER
の結合は、そうです、順序が重要です - そして、(
更新
)事態はもっと複雑です。
まず、外部結合は可換ではないので
a LEFT JOIN b
とは異なります。
b LEFT JOIN a
外側joinはassociativeではありません。
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
は、以下のものと同等です。 :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
が、です。
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
AND c.bc_id = b.bc_id
とは同等ではありません。 :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
AND b.bc_id = c.bc_id
もう一つ(できればもっと単純に)連想の例を挙げます。次のように考える。
(a LEFT JOIN b) LEFT JOIN c
:
a LEFT JOIN b
ON b.ab_id = a.ab_id -- AB condition
LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
これは
は同等です
から
a LEFT JOIN (b LEFT JOIN c)
:
a LEFT JOIN
b LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
ON b.ab_id = a.ab_id -- AB condition
というのも、quot;nice"があるからです。
ON
の条件を満たしています。どちらも
ON b.ab_id = a.ab_id
と
c.bc_id = b.bc_id
は等値検査であり
NULL
を比較します。
他の演算子を使った条件や、もっと複雑な条件も可能です。
ON a.x <= b.x
または
ON a.x = 7
または
ON a.x LIKE b.x
または
ON (a.x, a.y) = (b.x, b.y)
というように、2つのクエリは等価であることに変わりはない。
しかし、これらのいずれかが
IS NULL
のようなヌルに関係する関数や
COALESCE()
という条件であった場合、例えば
b.ab_id IS NULL
この場合、2つのクエリーは等価ではありません。
関連
-
[解決済み] varchar 値 'simple, ' をデータ型 int に変換する際に変換に失敗しました。
-
[解決済み】集約関数のないTSQLピボット
-
[解決済み] ORA-01790: 式は、対応する式と同じデータ型でなければならないエラーが発生するケース
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQLテーブルで重複する値を検索する
-
[解決済み] SQL ServerでJOINを使用してUPDATE文を実行するにはどうすればよいですか?
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み】「INNER JOIN」と「OUTER 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】INTERSECTとINNER JOINは根本的に違うのか?[重複している]
-
[解決済み] テスト
-
[解決済み】一括読み込みデータ変換エラー(切り捨て)
-
[解決済み] SQL Server - INNER JOIN WITH DISTINCT
-
[解決済み] Presto の JSON_EXTRACT で ' ' 文字を含むキーに問題がある。
-
[解決済み] 時間を時間単位や10分単位でグループ化する方法
-
[解決済み] SQLサーバーで文字列をsmalldatetimeデータ型に変換する際、変換に失敗しました(静的値を除く)。
-
[解決済み] SQLiteでどのようにピボットするか、つまり、長い形式で保存されたテーブルを広い形式で選択するか?
-
[解決済み] INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINの違いは何ですか?[重複しています]。
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?