2012-01-10 5 views
0

JOINLEFT JOINを変更する場合、私は最初のLEFT JOINは複数のJOINに適用されますか?

SELECT * FROM column1 
    LEFT JOIN column2 USING(id) 
    JOIN column3 USING(name) 
    JOIN column4 USING(info) 
    WHERE column1.id = 44 

の形で複数JOINを有します。明らかな理由から、column2.idがない場合は何も返されません。主なデータはcolumn1で、その他は補助データです。したがって、column1.idが存在する場合にだけデータを取得したいと考えています。

質問:最初のLEFT JOINは、後でJOIN(column3.nameが存在しない場合など)に関係なく、column1.idが存在するcolumn1の値を返すクエリを保証していますか?または、次の(すべて)JOINLEFT JOINに変更する必要がありますか?

答えて

2

質問への直接回答がnoであるため、いくつかの選択肢があります。

すべての後続の結合をLEFT JOINに変更します。サイドノートでは

SELECT * FROM column1 
    LEFT JOIN column2 USING(id) 
    LEFT JOIN column3 USING(name) 
    LEFT JOIN column4 USING(info) 
    WHERE column1.id = 44 

可能な場合は、クエリを再手配...

SELECT * FROM column1 
    JOIN column3 USING(name) 
    JOIN column4 USING(info) 
    LEFT JOIN column2 USING(id) 
    WHERE column1.id = 44 

それとも...

SELECT * FROM column1 
    JOIN 
    (
     column3 
    JOIN column4 USING(info) 
    LEFT JOIN column2 USING(id) 
) 
    USING(name) 
    WHERE column1.id = 44 


、私は避けたいです自然な結合とUSING構文です。ロジックはあまり透過的ではなく、バグにはよりオープンで、後で改行することができます(USINGオプションでフィールドを複製するテーブルの1つにフィールドを追加する場合など)。

+0

再配置は、有用ではありません。たとえば、column3.nameは存在しないため、何も返さないクエリに影響します。 P.S.サイドノートをありがとう!私は、「USING」は混乱の対象となり、好都合ではないことを知っていますが、私はなぜそれが好きか分かりません:) – Googlebot

1

これらは "連鎖"しているので、すべてが結合されたままになる必要があります。

0

left s。

すべてのJOINは、前のジョインから次のテーブルへの結果をジョインしようとします。

あなたはこのようなクエリ考えることができます:欠落している部分は、任意の列にあることができるよう

((column1 
    LEFT JOIN column2 USING(id) 
    ) 
    JOIN column3 USING(name) 
) 
    JOIN column4 USING(info) 
    WHERE column1.id = 44