1

SQL Server 2008 R2 に 3 つのテーブルがあるとします。

SELECT a.*, b.*, c.*
FROM
  Table_A a
  RIGHT JOIN Table_B b ON a.id = b.id
  LEFT JOIN Table_C c ON b.id = c.id

また

SELECT a.*, b.*, c.*
FROM
  Table_A a
  RIGHT JOIN Table_B b ON a.id = b.id
  JOIN Table_C c ON b.id = c.id

また、c に参加するときに b.id と a.id のどちらを使用しても問題はありませんか?

すなわち、代わりにJOIN Table_C c ON b.id = c.id、使用JOIN Table_C c ON a.id = c.id

ありがとうございました!

4

3 に答える 3

2

クエリのセマンティクスが変更されない場合、データベースサーバーは、より効率的であると思われる方法で実行するように結合を並べ替えることができます。

通常、特定の順序を強制する場合は、次のようにインラインビューサブクエリを使用できます。

SELECT a.*, x.*
FROM
  Table_A a
  RIGHT JOIN
  (
    SELECT *, b.id as id2 FROM Table_B b 
    LEFT JOIN Table_C c ON b.id = c.id
  ) x
  ON a.id = x.id2
于 2013-01-08T05:27:44.243 に答える
1

はい、RIGHT JOIN の後に LEFT JOIN が必要です

見る

http://sqlfiddle.com/#!3/2c079/5/0

http://sqlfiddle.com/#!3/2c079/6/0

そうしないと、最後の (内部) JOIN によって、RIGHT JOIN の効果が打ち消されます。

気にしないのであれば、RIGHT JOIN を使用しても意味がありません。気になる場合は、その後に LEFT JOIN を追加する必要があります。

于 2013-01-08T06:22:00.063 に答える
1

定義によると:

  • JOIN : 両方のテーブルに少なくとも 1 つの一致がある場合に行を返します
  • LEFT JOIN右側のテーブルに一致するものがなくても、左側のテーブルからすべての行を返します
  • RIGHT JOIN左側のテーブルに一致するものがなくても、右側のテーブルからすべての行を返します

a最初のオプションは、Tablesの最初の Join からのすべての raw を含みb、table に一致するものがない場合でもc、2 番目のステートメントは table のものに一致する raw のみを表示しますc

2番目の質問に関しては、 tableに一致するものがなくても、最初の結合にはidstable からのすべてが含まれるため、違いがあると思います。baa.idb.id

于 2013-01-08T05:34:17.233 に答える