18

私は内部結合を研究していて、私は古いWHERESQL-92の人です。その意味を知り、それがどのように機能するかを理解したいと思います。したがって、これはSQL結合に関する理論上の質問にすぎません。これは...

 SELECT * FROM   -- Query 1
 tbl1
 INNER JOIN (
          tbl2 
          INNER JOIN (
             tbl3 INNER JOIN tbl4 ON tbl3.Col1 = tbl4.Col1 
          ) 
          ON tbl2.col1 = tbl3.col2
 ) 
 ON tbl1.col1 = tbl3.col3

...これと同じですか?

 SELECT * FROM   -- Query 2
 tbl3 
 INNER JOIN tbl4 ON tbl3.col1 = tbl4.col1
 INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2
 INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3

...またはこれ(論理解像度でソートされていません)?

  SELECT * FROM   -- Query 3
  tbl3 
  INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3
  INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2
  INNER JOIN tbl4 ON tbl3.col1 = tbl4.col1

..またはこれ(参照ノードが変更されました。引用される前に参照されているテーブルがありますが、デカルト積は同じである必要があります)

  SELECT * FROM   -- Query 4
  tbl4 
  INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3
  INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2
  INNER JOIN tbl3 ON tbl4.col1 = tbl3.col1

..またはこれ?

  SELECT * FROM   -- Query 5 
  tbl1,tbl2,tbl3,tbl4
  WHERE 
  tbl3.col1 = tbl4.col1
  tbl2.col1 = tbl3.col2
  tbl1.col1 = tbl3.col3

...美的、構文的、ベストプラクティス、および機能的な観点から?

非常にオープンな質問ですが、コミュニティが光を当てるのは非常に興味深いと思います。

4

3 に答える 3

13

私が緊密に連携してきたすべてのデータベース エンジン (これはSQL ServerOraclePostgreSQLMySQLSybase、および) はSQLite、同じ計画に最適化します。InformixFirebird

ONただし、4 番目のクエリはすべてのエンジンで解析されるわけではありません (句で使用される前に句でテーブルを参照することはできませんJOIN) 。

MySQLSTRAIGHT_JOINプランで使用される結合順序に影響するoffers句。

Oracleはヒントが/*+ ORDERED */あり、 にSQL Serverも同様のヒントがありFORCE ORDERます。クエリがこれらのヒントを使用する場合、プランの順序は結合順序の影響も受けます。

于 2012-04-26T13:53:07.160 に答える
3

正当性の観点から、それらはおそらく等しいです。パフォーマンスの観点からは、RDBMSに依存します(SQL Serverについてのみ話すことができ、すべてのバリアントが同じ実行プランを生成します)。

于 2012-04-26T13:39:15.547 に答える
1

Sybaseでは、同じ実行プランもあります。クエリオプティマイザは、それらすべてに対して同じ実行プランを構築するのに十分賢いです:)

彼はクエリを内部的に変更して、最初に最小のテーブルを選択し、そのテーブルと内部結合を行う場合があります。

内部結合またはネストされた結合(最後の結合)の使用に関しては、最初の結合を使用します。テーブル間の接続で内部結合を行い、その後、必要に応じて、制限付きのwhere句を使用する方が読みやすくなります(この例では、これらの制限はありません)。

于 2012-04-26T13:49:55.677 に答える