2016-08-15 3 views
0

1つのクエリで苦労しています。SQL Serverの相対テーブルのすべてのレコードを確認する方法

私は3つのテーブル 偏差を持っている:複数の対策 measure_sources持つことができます。偏差の関係テーブルをここで 対策

を測定し、私は偏差 due_atに関連するすべての措置でこれを確認したい> CURRENTDATE:必要があります可視 < due_at CURRENTDATE:図示せず

偏差表

id name 
1 abc 
2 def 

対策ソーステーブル

id element_id measure_id 
1  1  1 
2  1  2 
3  1  3 
4  2  1 
5  2  2 

対策テーブル

id due_at 
1 2015-10-14 
2 2015-12-30 
3 2016-11-30 

期待された結果、現在

id 
2 

私は、クエリの下に使用していますが、私は来るべきでない偏差を取得しています

SELECT d.id FROM deviations d 
LEFT JOIN measure_sources ms ON ms.element_id = d.id 
LEFT JOIN measures m ON ms.measure_id = m.id 
WHERE (m.due_at > '2016-08-15' OR m.due_at is null) 

しかし、現在、私は結果 として1と2の両方を取得しています、私は間違っているところ私はあなたの問題が何であるかを理解していない

おかげ

+1

サム適切なデータと望ましい結果が役立ちます。 –

+0

サンプルデータを提供してください。 Please – Noman

+0

あなたが推測できる有用な情報を私たちに提供していないので。たとえば、Measure_sourcesを持つテーブルDevationsを結合し、joinするテーブルmeasure_sourcesのキーをelement_idといいます。それが正しいと確信していますか?私は、テーブルmeasure_sourcesのテーブルにあるdeviationIDというフィールドに – GuidoG

答えて

0

を提案してください。しかし、私はその質問に大きな潜在的な問題を見ることができます。一般に、left joinを使用する場合、最初の表を除くすべての条件はon節にある必要があります。あなたはLEFT JOIN秒を必要としない

SELECT d.id 
FROM deviations d LEFT JOIN 
    measure_sources ms 
    ON ms.element_id = d.id LEFT JOIN 
    measures m 
    ON ms.measure_id = m.id AND 
     m.due_at > '2016-08-15' ; 
+0

いいえまだ同じ問題があります – user3198315

0

が、INNER(プラスDISTINCT):

おそらくこれはあなたの問題を解決します

SELECT DISTINCT d.id FROM deviations d 
JOIN measure_sources ms 
    ON ms.element_id = d.id 
JOIN measures m 
    ON ms.measure_id = m.id 
WHERE m.due_at > '2016-08-15' 

をそして、あなたはより追加の列を必要としない場合deviationsあなたは参加を削除できます:

SELECT DISTINCT ms.element_id 
FROM measure_sources ms 
JOIN measures m 
    ON ms.measure_id = m.id 
WHERE m.due_at > '2016-08-15' 
+0

私は偏差が必要ですが、内部結合で試してみましたが、 :( – user3198315

+0

@ user3198315:1は、現在の 'due_at'の現在の日付が存在する唯一の' element_id'です。これはあなたの(少し混乱しやすい)記述にマッチします。 'all_ rows'が' due_at' <現在の日付?質問に詳細を追加する必要があります。結果に行が含まれているのはなぜですか? – dnoeth

関連する問題