select gys , jsy from gylog a
where a.gys in (111,222,333,444,555,666) and
a.jsy=(select max(jsy) from gylog b where a.gys=b.gys)------这个是连接2个表的关键取相同GYS中最大的JSY
where a.gys in (111,222,333,444,555,666) and
a.jsy=(select max(jsy) from gylog b where a.gys=b.gys)------这个是连接2个表的关键取相同GYS中最大的JSY
取相同GYS中最大的JSY
那也就是200602 200602 200606而第二个
select max(jsy) from gylog b group by gys---这个是取安GYS分组取最大的,那肯定就是
200602 200602 200606
第一句是不可以分开运行的,a.jsy=(select max(jsy) from gylog b where a.gys=b.gys)
取相同GYS中最大的JSY
能具体解释一下a.jsy=(select max(jsy) from gylog b where a.gys=b.gys)是怎么运行的吗?
where a.gys in (111,222,333,444,555,666) and
a.jsy=(select max(jsy) from gylog b where a.gys=b.gys)
-----------------------------------------------------------------------------------
SELECT扫描gylog表的每一行时,都会计算(select max(jsy) from gylog b where a.gys=b.gys)的值,然后将计算结果与a.jsy进行比较,若相等,则被选出.下面是扫描分解示意:
注:每行后面/**/内注释的为此(select max(jsy) from gylog b where a.gys=b.gys)表达式的计算结果:
gys jsy
111 200601 /*扫描此行时,表达式=200602,比较结果:不等*/
111 200602 /*扫描此行时,表达式=200602,比较结果:相等,被选出*/
222 200601 /*扫描此行时,表达式=200602,比较结果:不等*/
222 200602 /*扫描此行时,表达式=200602,比较结果:相等,被选出*/
333 200603 /*扫描此行时,表达式=200606,比较结果:不等*/
333 200606 /*扫描此行时,表达式=200606,比较结果:相等,被选出*/
所以,表扫描结束后,有三行的jsy与表达式运算结果相等而被选出.即:
111 200602
222 200602
333 200606
-----------------------------------------------------------------------------------
如果楼主需要第一个语句只返回一条记录333 200606,则可以这样:
select gys , jsy from gylog a where a.gys in (111,222,333,444,555,666) and
a.jsy=(select max(jsy) from gylog b) /*去掉 where a.gys=b.gys*/
select gys , jsy from gylog a where
a.jsy=(select max(jsy) from gylog b where a.gys in (111,222,333,444,555,666))
a.jsy=(select max(jsy) from gylog b where a.gys=b.gys)
条语句返回的结里最多是一条记录,而(select gys , jsy from gylog a where a.gys in (111,222,333,444,555,666) and
a.jsy in (select max(jsy) from gylog b group by gys))条语句返回的结里有可能是多条的。
第一条语句:是连接两个表查询的。
第二条语句:是对gys进行了分组呵呵见笑了。
如果要第一条语句的结果:
select gys , jsy from gylog a where a.gys in (111,222,333,444,555,666) and
a.jsy=(select max(jsy) from gylog )就会得到最大的gys
a.jsy=(select max(jsy) from gylog b where a.gys=b.gys)假设表中有
gys jsy
111 1
111 2
222 2
222 3
222 4
sql语句都是一条条执行的,对于第一条,由于jsy=1,而在gys=111这组中,jsy最大的是2,所以第一条不符合条件,不取; 第二条,由于jsy=2和gys=111这组中的最大值相等,所以条件符合,取出;再看第三条...都是雷同的
a.jsy=(select max(jsy) from gylog b where a.gys=b.gys)
select max(jsy) from gylog b where a.gys=b.gys就是取出当前gys这组中最大的jsy