当前位置: 代码迷 >> Oracle开发 >> sql联合查询的有关问题
  详细解决方案

sql联合查询的有关问题

热度:68   发布时间:2016-04-24 06:29:38.0
sql联合查询的问题
建立一个表A,
id   name
1    张三
2    李四
建立一个表B,
id    job     salary
1     001     10
1     002     20
2     002     20
2     003     30
现在想联合表AB得到如下结果:
id   name   job1   salary1   job2   salary2
1    张三     001     10          002      20   
2    李四     002      20         003      30
请问用sql怎么实现呢?
------解决思路----------------------
WITH T AS (
SELECT B.*,ROW_NUMBER()OVER(PARTITION BY ID,ORDER BY JOB) RN
FROM B
)
SELECT A.ID,MAX(A.NAME) NAME,
MAX(DECODE(B.RN,1,B.JOB)) JOB1,
MAX(DECODE(B.RN,1,B.salary)) salary1,
MAX(DECODE(B.RN,2,B.JOB)) JOB2,
MAX(DECODE(B.RN,2,B.salary)) salary2
FROM A,B
WHERE A.ID=B.ID
GROUP BY A.ID

------解决思路----------------------
只能固定列,如果还有job3还要加列
仅供参考:

select t1.id,
       t1.name,
       (select min(t2.job)
          from (select b.*,
                       dense_rank() over(partition by id order by job) rn
                  from b) t2
         where t2.rn = 1
           and t2.id = t1.id) job1,
       (select sum(t2.salary)
          from (select b.*,
                       dense_rank() over(partition by id order by job) rn
                  from b) t2
         where t2.rn = 1
           and t2.id = t1.id) salary1,
       (select min(t2.job)
          from (select b.*,
                       dense_rank() over(partition by id order by job) rn
                  from b) t2
         where t2.rn = 2
           and t2.id = t1.id) job2,
       (select sum(t2.salary)
          from (select b.*,
                       dense_rank() over(partition by id order by job) rn
                  from b) t2
         where t2.rn = 2
           and t2.id = t1.id) salary2
  from a t1;
  相关解决方案