我是编写SQL的新手,并且有一个遗留系统可供我使用,如下所示:
Table A
=========
id | tracker_id | created_on | status | p_id
1 | 1 | ... | (Table C latest new_val ) 4 | 121
Table B
=========
id | a_id | created_on |
1 | 1 | 2013-12-12 15:15:16
2 | 1 | 2013-12-15 15:20:16
3 | 1 | 2013-12-15 15:25:16
4 | 1 | 2013-12-15 15:30:16
5 | 1 | 2013-12-15 16:20:16
6 | 1 | 2013-12-16 17:20:16
7 | 1 | 2013-12-25 16:25:16
Table C
=========
id | b_id | type | old_val | new_val
1 | 1 | type1| 1 | 2
2 | 2 | type1| 2 | 3
3 | 3 | type1| 3 | 4
4 | 4 | type1| 4 | 5
5 | 5 | type1| 5 | 3
6 | 6 | type1| 3 | 5
7 | 7 | type1| 5 | 3
我希望在2013-12-13和2013-12-17之间的任何特定日期之间获得表A ID的计数,并在该时间范围内使用表C new_val的特定最新值,因此在上述情况下,如果我查询在“2013-12-13和2013-12-17”之间,p_id为121,表C new_val为5,我应该得到1。此外,如果我在“2013-12-13和2013-12-17”之间查询表C new_val为3我应该得到0。
我写了一份表格
的查询Select count(tableA.id) from tableA tableA
inner join tableB tableB on tableA.id=tableB.a_id
inner join tableC tableCdetails on tableB.id=tableCdetails.b_id
where tableCdetails.type = 'type1' and tableCdetails.new_val='5'
and tableB.created_on between '2013-12-13' AND '2013-12-17'
and tableA.p_id = 121
我尝试了一些使用试错法的组合,我在某些情况下使用上述查询获得了某些值,但是这与系统中的其他一些值不匹配。我想我错过了这样一个事实:我需要获取时间范围的最新tableB id并匹配对应于该tableB id的tableC条目的new_val,遗憾的是我无法弄清楚如何获取它。有人可以指导我如何在上面的查询中或使用任何其他方法(或者我以完全错误的方式进行查询)完成该操作。
答案 0 :(得分:0)
您需要获取最新的b值。一种方法是将条件放在from
子句中作为附加连接。另一种方法是使用带有相关子查询的where
子句:
where tableB.created_on = (select max(created_on)
from tableB b2
where b2.a_id = tableA.id
) and
. . . /* the rest of your conditions here */