2016-10-21 3 views
0

私はほぼ7000の行とテーブルを持つビューを持っていますが、私はまだビューからすべてを引き出し、該当する場合はUNITCOSTフィールドにnullを挿入します。ただし、一致する行のみを取得します。以下はコードです。他のテーブルに何も見つからないときでも、ジョインで1つのテーブルからすべての行を引っ張る

Select vto.*, vc.UNITCOST 
From myView vto 
LEFT JOIN VeryCost vc 
ON vto.VI_ID = vc.VI_ID 
Where (vc.VC_START_DATE BETWEEN '9/4/2016' AND '10/1/2016' 
      OR vc.VC_END_DATE BETWEEN '9/4/2016' AND '10/1/2016') 

だから、私は何をしたいVIフィールドが日付が有効で一致ビューとVeryCostテーブルからUNITCOST値からすべての行を選択しています。 VIフィールドが一致しても日付が有効でない場合は、UNITCOSTをそれらの行に対してnullにします。推論のための

+0

where句は、左結合を否定します。単に 'WHERE'という言葉を' AND'に変更するだけです。 where句を削除し、制限を結合に移動すると、すべての外部結合レコードが残るように結合前に制限が適用されます。 VCがNULL値で、除外されるのではなく、評価によって左結合によって生成されたNULLが除かれます。 – xQbert

答えて

1

参照のコメント...句は左を否定された

SELECT vto.*, vc.UNITCOST 
FROM myView vto 
LEFT JOIN VeryCost vc 
    ON vto.VI_ID = vc.VI_ID 
AND (vc.VC_START_DATE BETWEEN '9/4/2016' AND '10/1/2016' 
    OR vc.VC_END_DATE BETWEEN '9/4/2016' AND '10/1/2016') 

ザ・

が参加します。

結合が最初に行われるため、結合によって生成されたnullレコードが存在します。 VCが一致しているreocrdsだけをインクルードしているので、制限が適用されます。NULL値が存在します。 VC.Start_dateまたはVC.End_dateはNULLを考慮していないため、nullレコードが除外されているため、where句は左結合を否定します。

+0

ありがとうございました! –

2

WHEREはデータを制限しています。

Select vto.*, vc.UNITCOST 
From myView vto 
LEFT JOIN VeryCost vc 
ON vto.VI_ID = vc.VI_ID 
Where 
    (vc.VI_ID is null) 
    or 
    (vc.VC_START_DATE BETWEEN '9/4/2016' AND '10/1/2016' OR vc.VC_END_DATE BETWEEN '9/4/2016' AND '10/1/2016') 

EDITするか、別の答えは言及として、あなたは、JOIN基準に日付マッチングを含めることができます。vtoから非マッチを考慮するために、これを使用します。いずれにしても、不一致を除外するようなことはしないでください。

+0

VC.VI_IDをチェックしませんか?日付の代わりに(外部キー)? VC.VI_IDが移入されたときに日付がNULLであることが正当な可能性があります。これにはこれも含まれます。 – xQbert

+0

はい、今編集する方が良いでしょう。ありがとう! – SlimsGhost

関連する問題