2016-03-22 18 views
1

複数の左結合を実行するSQL Serverのクエリがあります。LEFT JOINは、1対多の関係で最大1行を返します。

...LEFT JOIN foo on a.id = foo.id AND foo.code = 100 

アップ、a.idが繰り返されていないクエリでその結合文に;:ある時点で私はに取得しますa.idごとに1行しかありません。しかしテーブルafooは1対多の関係を持っているので、その結合ステートメントの後に同じa.idの複数の行が得られます。

fooは、複数のレコードを常に持ちますが、foo.id = a.idですが、レコードがある場合とない場合があります。foo.id = a.id AND foo.code = 100です。そうした場合、そのようなレコードは1つしかありません。ですから、最後のクエリ結果で見たいのは、a.idごとに1行だけです。 foof.id = a.id and f.code = 100のレコードがある場合、そのレコードの日付の値はf.date1f.date2です。 fooにそのようなレコードがない場合は、f.date1f.date2のNULL値が必要です。コメントから

編集:

それはそのテーブルfooが判明、実際a.id = foo.id and foo.code = 100複数の行を持つことができます。

+1

これはうまくいかないのですか?それはあなたがそこに持っているものに基づいて動作するはずです。 foo.idがNULLの場合の行は、あなたがnull日付1を取得し、date2の –

+0

は多分f.date1 END ELSE THEN NULL SELECT CASEを行いますサンプルデータと所望の結果を提供する。あなたの 'join'はOKです - ' foo'から必要なフィールドだけを 'select'してください... –

+3

してくださいために同じことを行うと一致しないとき、左と一緒に日付1 がそう結合として – sgeddes

答えて

0

それを行うための1つの可能な方法はOUTER APPLYを使用することです:

SELECT 
    a.id 
    ,OA_foo.date1 
    ,OA_foo.date2 
FROM 
    a 
    OUTER APPLY 
    (
     SELECT 
      -- TOP(1) 
      foo.date1 
      ,foo.date2 
     FROM foo 
     WHERE 
      foo.id = a.id 
      AND foo.code = 100 
     -- ORDER BY ... 
    ) AS OA_foo 
; 

あなたはフィルタfoo.id = a.id AND foo.code = 100常にリターンのみ1行(または全く行)することを確実に知るならば、あなたは残すことができますそのままの質問。

ネストされたクエリが複数の行を返し、1つの行だけを残したい場合は、適切なORDER BYTOP(1)を指定します。

関連する問題