1

これをどのように説明するかはよくわかりません。また、それが単なる糖衣かどうかもわかりません。初めて見たのですが、その理由と内容についての参考資料や説明がなかなか見つかりません。

次のようなクエリがあります。

select * from
     table1
          join table2 on field1 = field2
          join (
               table3 
                    join table4 on field3 = field4
                    join table5 on field5 = field6
               ) on field3 = field2 
               -- notice the fields in the parens and outside the parens 
               -- are part of the on clause

かっこは必要ですか?それらを削除すると、結合順序が変更されますか?この場合、私はSQLServer2005環境にいます。ありがとう!

4

3 に答える 3

3

結合順序は、 (列の順序以外の)自然結合を使用するクエリの結果セットに違いがないようにする必要があります。クエリ

select *
from t1
join t2 on t2.t1_id = t1.id

と同じ結果セットを生成します

select * from t2 join t1 on t1.id = t2.t1_id

外部結合を使用していて、from句のテーブルの順序を変更する場合は、当然、外部結合の方向を変更する必要があります。

select *
from      t1
left join t2 on t2.t1_id = t1.id

と同じです

select *
from       t2
right join t1 on t1.id = t2.t1_id

ただし、次のような構文でテーブルとして使用されるサブクエリが表示された場合

select *
from t1
join ( select t2.*
       from t2
       join t3 on t3.t2_id = t2.id
       where t3.foobar = 37
     ) x on x.t1_id = t1.id

x上記のサブクエリに割り当てられたテーブルエイリアス()に注意してください。

あなたが持っているのは 派生テーブルと呼ばれるものです(仮想テーブルと呼ばれる人もいますが)。これは、クエリの存続期間中に存在する一時的なビューと考えることができます。これは、集計の結果()などに基づいて何かをフィルタリングする必要がある場合に特に便利ですgroup by

select句の下の、に関するT-SQLドキュメントの詳細については、以下fromを参照してください。

于 2012-08-27T16:19:05.217 に答える
2

この場合、それらは必要ありません:

select * from table1
join table2 on field1 = field2
join table3 on field3 = field2 
join table4 on field3 = field4
join table5 on field5 = field6

同じ結果が得られます。

于 2012-08-27T15:56:56.443 に答える
2

この場合は必要ありません。

特にネストされた呼び出しに名前を付ける場合は、他のいくつかの場合に必要です(または少なくともはるかに簡単です)。

select table1.fieldX, table2.fieldY, sq.field6 from
table1 join table2 on field1 = field2
join ( select
   top 1 table3.field6
   from table3 join table4
   on field3 = field4
   where table3.field7 = table2.field8
   order by fieldGoshIveUsedALotOfFieldsAlready
           ) sq on sq.field6 = field12345

あなたが持っていた可能性のあるコードは次のとおりです。

  1. 上記のように一度、リファクタリングします。
  2. 機械製造。
  3. 開発者がクエリに到達したときの思考プロセスを反映し、より大きなクエリのその部分を1つの単位として考え、それをより大きなクエリに組み込みました。
于 2012-08-27T15:59:56.073 に答える