日期:2014-05-17  浏览次数:20823 次

sql子查询问题
表一 temp1
  login_id name post_name
  1 张三 java
  2 李四 .net

表二 temp2
  login_id name pro_post_name result desc time
  1 张三 java 1 。。。 2012-05-12
  1 张三 java 2 。。。 2012-06-05
  2 李四 java 2 。。。 2012-05-22
  2 李四 .net 2 。。。 2012-05-12


要做的是根据表一中的 login_id 和 post_name 查询出来 表二中对应的 reuslt 和 desc
我的做法是
select
  a.login_id,
  a.name,
  a.post_name,
 (select b.result from temp2 b where b.login_id =a.login_id and b.pro_post_name=a.post_name and ROWNUM <=1 order by time desc ),
 (select b.desc from temp2 b where b.login_id =a.login_id and b.pro_post_name=a.post_name and ROWNUM <=1 order by time desc )
from temp1 a


如果单独写一条SQL 
select b.desc from temp2 b where b.login_id ='1'and b.pro_post_name='java'and ROWNUM <=1 order by time desc 
可以查询到数据,但是写成两个表关联起来 就差不多了。
求解。

------解决方案--------------------
SQL code

with temp1(login_id,name,post_name) as(
select 1,'张三','java' from dual
union all select 2,'李四','.net' from dual
),
temp2(login_id,name,pro_post_name,result,"desc",time) as(
select '1','张三','java',1,'desc1',to_date('2012-05-12','yyyy-mm-dd') from dual
union all select '1','张三','java',2,'desc2',to_date('2012-06-05','yyyy-mm-dd') from dual
union all select '2','李四','java',2,'desc3',to_date('2012-05-22','yyyy-mm-dd') from dual
union all select '2','李四','.net',2,'desc4',to_date('2012-05-12','yyyy-mm-dd') from dual
)
select a.login_id,a.name,a.post_name,b.result,b."desc"
from temp1 a
inner join temp2 b on a.login_id=b.login_id and a.post_name=b.pro_post_name
    and b.time=(select max(time) from temp2 c where c.login_id=b.login_id and c.pro_post_name=b.pro_post_name);
/*
  LOGIN_ID NAME         POST_NAM     RESULT desc                                
---------- ------------ -------- ---------- ----------                          
         1 张三         java              2 desc2                               
         2 李四         .net              2 desc4   
*/