问一个SQL select的问题,请大侠不吝赐教

时间:2022-09-16 16:53:48
现在有一个T表,表中有四列,分别为纳税人识别号(nsrsbh)、税种代码(szdm)、登记时间(sj)、附加信息(xx)。表格如下:
nsrsbh     szdm       sj          xx
4511        01       2007.03      kii
4508        01       2009.01      abc
4508        01       2010.02      xyz
4509        01       2011.06      gtt
4509        03       2011.06      eet
4508        02       2012.01      frr
4509        01       2012.08      frr
4511        03       2012.06      gop
4508        01       2012.10      att

这个表是登记纳税人登记税种的表,因为纳税人有时候会改变税种的附加信息,会导致一年内有几条同一个税种附加信息(xx)的记录,现在要找出税种代码(szdm)为01的所有纳税人最新的附加信息(xx),请问要怎么写?
如上表,我要输出的结果应该如下:
nsrsbh     szdm       sj          xx
4508        01       2012.10      att
4509        01       2012.08      frr
4511        01       2007.03      kii

开始我是这样写的:
select t.* from T where t.szdm='01' and not exists(select 1 from t j where t.nsrsbh=j.nsrsbh and t.sj<j.sj)

这样写输出的结果为:
nsrsbh     szdm       sj          xx
4508        01       2012.10      att
4509        01       2012.08      frr
如果某个纳税人识别号没有多条记录的话就会被过滤掉,不符合我的需求,
请教一下各位大哥看看这个SQL怎么写啊?感谢!

3 个解决方案

#1


select t.* from T a where t.szdm='01' 
and sj=(select max(sj) from T where nsrsbh=a.nsrsbh)

#2


呵呵,谢谢楼上的,我找出问题所在了,原来是在not exists里面写漏了一个条件j.szdm='01',改为如下就可以正确得出结果:
select t.* from T where t.szdm='01' and not exists(select 1 from t j where t.nsrsbh=j.nsrsbh and j.szdm='01' and t.sj<j.sj)

非常感谢大哥!
楼上的大哥的写法也是在括号里面漏写了szdm='01',加上这个条件就可以得出正确结果。
以上全部在ORACLE通过验证!

#3


多点人来讨论我就结贴啊!

#1


select t.* from T a where t.szdm='01' 
and sj=(select max(sj) from T where nsrsbh=a.nsrsbh)

#2


呵呵,谢谢楼上的,我找出问题所在了,原来是在not exists里面写漏了一个条件j.szdm='01',改为如下就可以正确得出结果:
select t.* from T where t.szdm='01' and not exists(select 1 from t j where t.nsrsbh=j.nsrsbh and j.szdm='01' and t.sj<j.sj)

非常感谢大哥!
楼上的大哥的写法也是在括号里面漏写了szdm='01',加上这个条件就可以得出正确结果。
以上全部在ORACLE通过验证!

#3


多点人来讨论我就结贴啊!