select D.id,B.class,B.teacher,D.name,D.age,D.year
from B,
(
select A.id,A.name,A.age,A.year
from A
where A.year > (select min(C.year) from a C where A.id = C.id)
) D
where D.id = B.id

解决方案 »

  1.   

    用分析函数
    SQL> select * from t1;ID    NAME                        AGE YEAR
    ----- -------------------- ---------- --------------------
    001   张三                         18 2001.1
    002   李四                         20 2001.2
    003   王五                         21 2001.3
    001   张四三                       18 2001.5
    002   李四三                       20 2001.7SQL> select * from t2;ID    CLASS                TEACHER
    ----- -------------------- --------------------
    001   class1               a
    002   class3               b
    003   class1               cSQL> select t2.*,t.name,t.age,t.year from t2,(
      2  select id,name,age,year from
      3  (select t1.*,dense_rank() over(partition by id order by year desc)y from t1 ) where y=1)t
      4  where t.id=t2.id;ID    CLASS                TEACHER              NAME                        AGE YEAR
    ----- -------------------- -------------------- -------------------- ---------- --------------------
    001   class1               a                    张四三                       18 2001.5
    002   class3               b                    李四三                       20 2001.7
    003   class1               c                    王五                         21 2001.3
      

  2.   

    select a.id,c.class,c.teacher,a.name,a.age,a.year from a,(select * from b where rowid in select max(rowid) from b group by id) c where a.id=c.id
      

  3.   

    select x.id, t2.class, t2.teacher, x.name
    from 
    ( select a.id, a.name, a.age, a.year 
      from t1 a, t1 b 
      where (a.id = b.id) and (a.year > b.year) and 
            (a.year = (select max(year) from t1 c where c.id = a.id ))
    ) x, t2 
    where x.id = t2.id
      
    (假设year 每次都不同)。  
      

  4.   

    数据库设计不合理,
    应该表 a只保存最终结果.
    加上一各a_tran的表.
    记录每次变更.
      

  5.   

    没有表c  
    表 b
    id    class        teacher 
    001    class1        a
    002    class3        b
    003    class1         c
    .......... 省略表 a
     id  name    age     year
    001  张三   18        2001.1
    001  张四三   18        2001.5
    002  李四   20        2001.2
    002  李四三   20        2001.7
    要求通过sql语句得到如下表
     id   class    teacher   name    age     year
    001   class1   a         张四三   18        2001.5
    002   class3    b       李四三     20        2001.7
      

  6.   

    select x.id, t2.class, t2.teacher, x.name
    from 
    ( select a.id, a.name, a.age, a.year 
      from t1 a, t1 b 
      where (a.id = b.id) and (a.year > b.year) and 
            (a.year = (select max(year) from t1 c where c.id = a.id ))
    ) x, t2 
    where x.id = t2.id
      
    (假设year 每次都不同)。  里面有表c吗, 是别名
      

  7.   

    表 b
    id    class        teacher 
    001    class1        a
    002    class3        b
    003    class1         c
    .......... 省略表 a
     id  name    age     year
    001  张三   18        2001.1
    001  张四三   18        2001.5
    002  李四   20        2001.2
    002  李四三   20        2001.7
    要求通过sql语句得到如下表
     id   class    teacher   name    age     year
    001   class1   a         张四三   18        2001.5
    002   class3    b       李四三     20        2001.7
    003   class1    c         王五      21        2001.3
      

  8.   

    --对不起,上面的写错了。--try:select c.id,b.class,b.teacher,c.name,c.age,c.year from (select * from a where rowid in select max(rowid) from a group by id) c,b where b.id=c.id;
      

  9.   

    还有一点小错select c.id,b.class,b.teacher,c.name,c.age,c.year from (select * from a where rowid in (select max(rowid) from a group by id)) c,b where b.id=c.id;