2016-08-15 24 views
0

我正在努力處理一個查詢。如何檢查sql server中的相關表中的每條記錄

我有三個表 不同之處:可以有一個以上的措施 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

Sam數據和期望的結果將有所幫助。 –

+0

請提供您的樣品數據。請 – Noman

+0

既然你不提供有用的信息,我們只能猜測。例如,您使用Measure_sources連接表Devations,並且您加入的表measure_sources中的鍵稱爲element_id。你確定這是正確的嗎?我期望表measure_sources中的一個名爲deviationID的域以 – GuidoG

回答

0

我不明白你的問題是什麼。但是,我可以看到查詢存在很大的潛在問題。一般來說,在使用left join時,除第一個表格外的所有條件都應在on條款中。

或許這將解決您的問題:

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

你不需要LEFT JOIN S,但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

我需要偏差,並且我嘗試過使用內部連接,但現在我只獲得id 1作爲結果:( – user3198315

+0

@ user3198315:1是唯一的'element_id',其中存在'due_at'>當前日期,這與您的(有點混淆)描述相匹配。Mayby您希望'element_id'其中* all *行具有'due_at' <當前日期?您可能需要爲您的問題添加更多詳細信息,爲什麼或爲什麼不將結果包含在結果中。 – dnoeth

相關問題