2016-08-15 91 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

相关问题