如何检查sql server中相对表中的每条记录


How to check every record in relative table in sql server

我正在努力查询。

我有三张表偏差:可以有多个测量值Measure_sources:偏差与度量的关系表措施

这里,我想在与偏差相关的每个测量上检查这一点Due_at> currentdate:应该可见due_at & lt;当前日期:未显示

偏差表

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的结果请指出我错在哪里

谢谢

我不明白你是什么问题。但是,我可以看到这个查询有一个很大的潜在问题。一般来说,当使用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' ;

你不需要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的额外列,你可以删除一个join:

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'