2016-11-10 10 views
1

私は、複数のテーブルで結合がどのように機能するか誤解を招くことがあります。 3つのテーブルA、B、Cがあり、それらに参加する必要があるとします。ここで複数のテーブルの内部結合

はここでV1

SELECT A.NAME AS name1 
    ,B.NAME AS name2 
    ,C.NAME AS name3 
FROM A 
INNER JOIN B 
    ON A.id = B.id 
INNER JOIN C 
    ON B.id = C.id 

あるV2

SELECT A.NAME AS name1 
    ,D.NAME AS name2 
    ,D.NAME AS name3 
FROM A 
INNER JOIN (
    SELECT B.NAME AS name2 
     ,C.NAME AS name3 
    FROM B 
    INNER JOIN C 
     ON B.id = C.id 
    ) AS D 
    ON A.id = D.id 

は、2つのバージョンのいずれかのパフォーマンスの違いはありますか? 最初のクエリがより洗練されているように見えますが、クエリビルダUIを構築する必要があります。

+0

もう1つは、内側のクエリで 'Id'を選択していないので、2番目のクエリは失敗します。しかし、もっと重要なのは、これらは同じクエリではないということです。最初のものでは、 'A'を' B'に、 'A'を' C'に関連づけています。第2の場合、あなたは 'B'を' C'に関連づけています。これは最初のクエリで定義された関係ではありませんでした。それだけでなく、第2のバージョンははるかに読みにくく/理解することが困難です。あなたは最初のバージョンに固執すべきです - それはよりクリーンで理解しやすいです。 – Siyual

+0

@Siyual - 2つのジョインで暗黙的にBからCへの関係はありません - JOIN B ONではありませんA.id = B.id JOIN C ON A.id = C.idはJOIN B ONと同じ結果を返しますA.ID = B.id JOIN C ON B.id = C.id – PaulF

+0

@PaulFこのシナリオでB対Cの関係が存在すると推測する唯一の方法は、IDのフィールドでテーブルを結合する場合です3つすべて(これは彼の例とまったく同じですが、ダミーコードのように見えますが、彼が実際に使っているものではありません)。 *しかし*、私は非常にあなたがそれぞれの主キーが同じである3つのテーブルを介して結合を行う必要があることを疑う。そうであれば、BからCへの関係を推論することができます。しかしそうでなければ、あなたはその接続をすることはできません。 – Siyual

答えて

1

一般に、副選択の問題は、副選択を実行するためにRDBMSに一時テーブルを作成する必要があり、十分な大きさのテーブルではこれが重大な支出になる可能性があり、潜在的にクエリを最適化するための副選択、そしてテーブルをスキャンしています。

もちろん、テーブルのDDLとサイズは含まれていませんので、Postgresには何をし、比較/比較を計画するかを説明するのが最善の方法です。

関連する問題