2016-05-11 10 views
0

Iは5つのテーブルを持っている:A、B、C、D、E次のSQL left joinで何が問題になっていますか?

A:{ID、値、グループID、FilterID、in_date時点}

B:{ID、説明、Out_Date、FROM_DATE}

C:{ID、カテゴリ}

D:{グループID、のGroupName}

E:{FilterID、FILTERNAME}

B内のIDが欠落していることができますその結果、私はLEFT JOINを実行して必要な情報を取得しようとしています。私のデータセットでは、BまたはCにないIDを持つAに行を明示的に追加しました。次のクエリではそれが選択されると予想されますが、それは起こりません。私はIDがBかCでないときに、私が原因私はnull値とするフィールドを取得するために、この問題を解決するにはどうすればよいのヌルBの値とC.

SELECT A.Value, A.Group, B.Description, C.Category, D.GroupName, E.FilterName 
FROM A LEFT JOIN B ON A.ID = B.ID  
     LEFT JOIN C ON A.ID = C.ID, 
    D,E 
WHERE 
B.Out_Date>A.In_Date, 
A.GroupID=D.GroupID, 
A.FilterID=E.FilterID 

にWHERE句で間違ったつもりだと考えていますしかし、A?

答えて

1

1)古いコンマ区切りの結合構文と、最新の明示的な結合構文を混用しないでください。

2)left joinの場合は、右側の表の条件をON節に置き、真の左結合動作を取得します。 (WHEREにあなたがインナー得るときの結果を結合します。)

SELECT A.Value, A.Group, B.Description, C.Category, D.GroupName, E.FilterName 
FROM A LEFT JOIN B ON A.ID = B.ID AND B.Out_Date > A.In_Date 
     LEFT JOIN C ON A.ID = C.ID 
     JOIN D ON A.GroupID = D.GroupID 
     JOIN E ON A.FilterID = E.FilterID 

ValueGroupは、ANSI SQLでの予約語なので、あなたは"Value""Group"として、それらを区切るために必要があるかもしれません。

+0

私たちは同じアイデアを持っていたように見えます – HoneyBadger

+0

@HoneyBadger、他にも何かできますか? – jarlh

+0

明らかにそうではありません:P – HoneyBadger

1

最初の点:joinの構文を混同しないでください。明示的な構文を使用してください。

where句のため、left joinsを有効にinner joinsに設定してください。あなたはおそらく探しています:

SELECT  A.Value, A.Group, B.Description, C.Category, D.GroupName, E.FilterName 
FROM  A 
LEFT JOIN B 
     ON A.ID = B.ID 
     AND B.Out_Date > A.In_Date 
LEFT JOIN C 
     ON A.ID = C.ID 
INNER JOIN D 
     ON A.GroupID = D.GroupID 
INNER JOIN E 
     ON A.FilterID = E.FilterID 
1

あなたの問題にこのクエリを使用することができます。 {ID、値、グループID、FilterID、in_date時点}

B:ここ

SELECT  A.Value, A.Group, B.Description, C.Category, D.GroupName, E.FilterName 
FROM  A 
LEFT JOIN B 
    ON A.ID = B.ID 
    AND B.Out_Date > A.In_Date 
LEFT JOIN C 
    ON A.ID = C.ID 
LEFT JOIN D 
    ON A.GroupID = D.GroupID 
LEFT JOIN E 
    ON A.FilterID = E.FilterID 
+0

はい、内部結合を使用していますが、左結合を使用しました。 –

+1

ああ、それを逃した。私は私のコメントを削除します。あなたが何らかの説明を加えれば、それは決して助けにならないでしょう。 – HoneyBadger

1

は、あなたのテーブルの詳細

Aは、{ID、説明、Out_Date、FROM_DATE}

C: {ID、カテゴリ}

D:{グループID、のGroupName}

E:{FilterID、FILTERNAME}

今、あなたはあなたが、私はこれがあなたのための完全な助けであると思います

 SELECT A.Value, A.Group, B.Description, C.Category, D.GroupName,E.FilterName from A left join B on A.ID=B.ID 
left Join C on A.ID=C.ID 
Left Join D on A.GroupID=D.GroupID 
Left Join E on A.FilterID=E.FilterID 
where B.Out_Date>A.In_Date 

流れるスクリプトを試してみてください に参加左使用してデータを取得してみてください。

+0

where句にB.Out_Dateがあるので、Bテーブルはここで結合されたままになりません。 – jarlh

関連する問題