select * from topmanager a where a.Dir001 in (select dir001 from (select Dir001 from topmanager where F0001=a.F0001 and length(Dir001)>0 and length(Dir001)>0 and Dir001 is not NULL order by F0002 desc) where rownum=1)

解决方案 »

  1.   

    ERROR 位于第 1 行:
    ORA-00904: 无效列名
    我都说了,直接修改top为rownum的句式我试过,会出错的,大概是order by 那句外加了括号,里面的对a表的引用无效,不知对不对。desc topmanager DA                                        NOT NULL DATE
     TM                                        NOT NULL CHAR(5)
     SEQ                                       NOT NULL NUMBER
     F0001                                     NOT NULL CHAR(8)
     F0002                                     NOT NULL DATE
     DIR001                                             VARCHAR2(20)
    其他字段用不到,我就不列了!
      

  2.   

    嘿嘿,不好意思,不知道怎么写,可是我发现你这个SQL语句本身就有问题,虽然不错,但不知道为什么这样写,首先,top 1当然是只取一条纪录,可是为什么还用in,还有like 'NULL'没有通配符,那还用like有什么意义?
    个人一点看法,如有不对,请高人指教!
      

  3.   

    我根据你所描述的所需结果集,重写了语句如下,你试一下:select a.* from topmanager a, (select F0001, max(F0002) F0002 from topmanager group by F0001) b
    where a.F0001 = b.F0001 and a.F0002 = b.F0002
      

  4.   

    不好意思,还是不行,因为最近时间的肯定有最近一届的数据,但肯定不包含全部。打个比方,咱们国家最近的两会选举新一届的领导人,国家主席,人大委员长,政协主席的产生日期都不是同一天,但他们却是同一届的领导人。你通过取最近的日期,好象我记得总理是最后产生的,所以你的代码只能获得最新一届的总理的记录,其他的国家主席等就查不出来了。这就是查询里要用top 1,而不用max的原因,而且因为Dir001字段是大写的一,二,三,四,五,十一,max(Dir001)时,十一不一定比五大。
      

  5.   

    受wenzhulz(触丝)的启发,我也改成两表的连接格式,大概可以了!如下,欢迎大家评论。我今天会结帖的,当然分会给wenzhulz(触丝),因为其他的帖我大概都试过,且对有问题的句法我在发帖时就有说明,这些帖就不给分了。select a.* from T0001004 a,(select distinct F0001,Dir001 from (select F0001,F0002,Dir001,seq,rank() over (partition by F0001 order by F0002 desc) ranknum from T0001004 where Dir001 is not null and length(rtrim(Dir001))<>0) where ranknum<=1) b where a.F0001=b.F0001 and a.Dir001=b.Dir001 and a.F0001='01000002' order by a.F0001,a.F0002
      

  6.   

    NND,用户是Oracle 815环境,不支持Rank()函数,有谁知道Oracle815下如何处理我楼上的那一条语句?分不够时我再加!