2017-03-14 7 views
-2

以下のSQLFiddleリンクを参照してください。SQLヘルプ、フィルタ付き左結合

http://sqlfiddle.com/#!9/22e094/4

私の目標は、表1からすべてのレコードを取得することで、SecIdは表2に存在する場合、ステータスは「Y」である場合にのみ参加します。

結果は、表1から引くことをする必要があります:ID 1と2とID 1のために、それが正常に左表2に参加し、引っ張る「Y」

あなたはフィドルで見ることができるように、私は別の3を試してみました方法を得ることができない。

私は困惑しています...ヘルプは素晴らしいでしょう! :)

+0

これがMySQLの場合は、なぜタグを付けますか? – Niagaradad

+0

あなたの説明が不明であるため、期待される結果を表形式で投稿してください – BobC

+0

@Niagaradad SQLFiddleのOracleオプションに問題がありました – Gvdk

答えて

0

ON節の結合条件だけの左結合は問題ありません。その後、

しかし、あなたはstatussecidtable2に存在するときにのみ'Y'ある行を維持したいと述べました。つまり、secidtable2からNULLまでの行を保持したいということです。

select *は、同じ名前の列が両方の表にsecidあるため、飛びません。あいまいさを解消するには、where句、またはクエリ内の他の場所でそれらを参照する必要がある場合、それらを区別する必要があります(エイリアスを与えるか、少なくとも1つを指定することによって、それらの両方にエイリアスを付ける必要があります)。また、WHERE句の後に評価されるSELECT句でのみエイリアスを指定できるため、サブクエリで左結合を行う必要があります。

select id, secid_a, secid_b, status 
from ( 
     select a.id, a.secid as secid_a, b.secid as secid_b, b.status 
     from table1 a left join table2 b 
         on a.secid = b.secid 
     ) 
where status = 'Y' or secid_b is null; 
+0

恐ろしいです!それでおしまい!私はselectを使ってselectの結果をフィルタリングすることについて考えなかった。 – Gvdk

+0

@Gvdk - これは「サブクエリを持つクエリ」または「ネストされたクエリ」と呼ばれ、SQLでは非常に一般的な手法です。あなたはいつもそれを使用します。 – mathguy

+0

ありがとう、毎日新しいことを学ぶ! – Gvdk