首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

sql函数有关问题,请问,多谢

2012-01-31 
sql函数问题,请教,谢谢!表结构如下:idnametype1toma2jackbjobIDpersonIDjobtitle11deputygeneralmanager21

sql函数问题,请教,谢谢!
表结构如下:
idnametype
1toma
2jackb


jobIDpersonIDjobtitle
11deputy   general   manager
21CEO
32CIO
42vice   manager

要求结果如下:
nametitle
tomdeputy   general   manager,CEO
jackvice   manager,CIO

请大家指教,谢谢!


[解决办法]
--测试数据
create table t1(id int, name varchar2(100), type varchar2(100));
insert into t1
select 1, 'tom ', 'a ' from dual union all
select 2, 'jack ', 'b ' from dual;
/
create table t2(jobID int, personID int, jobtitle varchar2(100));
insert into t2
select 1,1, 'deputy general manager ' from dual union all
select 2,1, 'CEO ' from dual union all
select 3,2, 'CIO ' from dual union all
select 4,2, 'vice manager ' from dual;
/
--执行查询
select name, substr(max(sys_connect_by_path(jobtitle, ', ')), 2) title
from (select jobtitle, name, row_number() over(partition by personid order by 1) rn
from (select name,personid,jobtitle from t1,t2 where t1.id=t2.personid))
start with rn = 1
connect by rn - 1 = prior rn and name = prior name
group by name;
/
--查询结果
name title
jackCIO,vice manager
tomdeputy general manager,CEO
[解决办法]
第二種方法就是寫個函數
假設 D表
id name type 
1 tom a 
2 jack b 
E表
jID pID jobtitle 
1 1 deputy general manager 
2 1 CEO 
3 2 CIO 
4 2 vice manager 


create or replace function fff(v_id number)
return varchar2 is
v_title varchar2(30);
begin
for c1 in (select title from e where pid=v_id ) loop
v_title:=v_title||' '||c1.title;
end loop;
return v_title;
 end;
select distinct d.name, fff(d.id) from e,d where d.id=e.pid
[解决办法]
select name,jobtitle from
 (select name,personid,jobtitle from( select t1.name as name,p1.personid as personid,p1.jobtitle||','||p2.jobtitle as jobtitle,row_number()over(partition by p1.personid order by 1)as rw from t2 p1,t2 p2,t1
where p1.personid=p2.personid and p1.jobtitle<>p2.jobtitle and t1.id=p1.personid)
 where rw=1)

热点排行