2016-12-12 6 views
0

3つのテーブルが使用されているクエリを作成しました。最初のテーブルには必要なすべての名前があります。 2番目と3番目のテーブルは、請求額がある名前を私に与えます。しかし、私は1番目のテーブルからもすべての名前が必要です。外部結合に余分なエントリが表示されない

SELECT a.name, 
     nvl(c.bill_amount,0) 
    FROM table_1 a left outer join table_2 b 
    ON a.name = b.name 
    left outer join table_3 c on B.phone_number = C.phone_number 
     AND B.email = C.email 
     where b.status = 'YES' 
     and a.VALID = 'Y'; 

ここで、テーブルbとテーブルcは私に限られた数の名前を与えます。しかし、table_1には10の名前があります。私は彼らの名前に0 bill_amountでそれらを表示したい。私はOracleを使用しています。

+0

これをどこに変更しますか。 'b.status =' YES 'OR WHERE(b.status =' YES 'OR b.status IS NULL)'またはそれをジョイン(where句から取り出します) 'AND b.status =' YES '' –

答えて

1

右側のテールにwhere句を適用すると、基本的にインナー結合になります。結合条件を

てみ状態を入れて、それOUTER保つために:

SELECT a.name, 
     nvl(c.bill_amount,0) 
FROM table_1 a 
left outer join table_2 b 
    ON a.name = b.name 
    and b.status = 'YES' -- Put it here 
left outer join table_3 c 
    on B.phone_number = C.phone_number 
    AND B.email = C.email 
where a.VALID = 'Y'; -- Only items from the left hand table should go in the where clause 
+0

これはほとんどの問題を解決しました。今は冗長なデータを取得しています。 – Akshay

+0

@Akshay冗長なデータですか?重複している場合は、DISTINCTを使用してください – JohnHC

+0

ありがとうございます。それは私の問題を解決した – Akshay

0

上記の答えは右である、私はより正確になりたいです。実際には、左結合が一致しない場合、右テーブルの列はNULLに設定されます。

実際には、NULLは常にSQLで値を伝播します。したがって、結合が数式でない場合にはb.status = 'YES'の値はNULLです。

これを処理する一般的な方法は、(b.status = 'YES' or b.name IS NULL)次のようになります。b.nameが参加している場合のみならば、それがnullの結合列であるため、b.statusの場合ではない可能性がある、一致していません。

NULLが配信されているため、field = NULLではなくfield IS NULLを使用することはできません。

しかし、より明確な場合は、結合節に入れても構いません。

+0

私が指摘したのと同じ問題があります.b.status = 'YES'条件は視点に入れません。その価値を取り除くと、ステータスはNULLになります。しかし、私はstatus = 'YES' – Akshay

関連する問題