高分求一SQL语句

Tennal1020 2005-05-29 02:11:32
表一:
COMPANY_ID COMPANY_NAME
1 公司1
2 公司2

表二:
JOB_ID COMPANY_ID JOB_TITLE
1 1 JAVA软件工程师
2 1 C++软件工程师
3 2 ORACLE开发工程师
4 2 ORACLE DBA

想要在一个记录集得到每个公司所招聘的职位列表(每个公司一条记录),各职位之间以逗号相隔,示例如下:
COMPANY_NAME JOB_TITLE
公司1 JAVA软件工程师,C++软件工程师
公司2 ORACLE开发工程师,ORACLE DBA

请问可以用一条SQL语句实现吗?我想了好久都没有想出来。
...全文
108 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tennal1020 2005-05-30
  • 打赏
  • 举报
回复
xiaoxiangqing(肖祥清) ,zhangzs8896(小二) :高人啊,以后要多向你们请教啊。
zhangzs8896 2005-05-30
  • 打赏
  • 举报
回复
--这是一个行列转换的问题,坛子里不少。
--建立测试数据
create table 表一(COMPANY_ID int,COMPANY_NAME varchar(10))
insert 表一
select 1,'公司1'
union all
select 2 ,'公司2'

create table 表二(JOB_ID int,COMPANY_ID int,JOB_TITLE varchar(200))
insert 表二
select 1, 1, 'JAVA软件工程师' union all
select 2, 1 , 'C++软件工程师' union all
select 3, 2 , 'ORACLE开发工程师' union all
select 4, 2 , 'ORACLE DBA'

--查询代码
declare @s varchar(8000),@i varchar(20)
select * into #t
from (select a.COMPANY_NAME,b.JOB_TITLE
from 表一 a inner join 表二 b on a.COMPANY_ID=b.COMPANY_ID)a
set @s=''
set @i=0
update #t
set @s=case when @i=COMPANY_NAME then @s+','+JOB_TITLE
else JOB_TITLE end,
@i=COMPANY_NAME,COMPANY_NAME=@i,JOB_TITLE=@s
select COMPANY_NAME,JOB_TITLE=max(JOB_TITLE)
from #t
group by COMPANY_NAME

--删除测试表
drop table 表一,表二,#t
--测试结果:
COMPANY_NAME JOB_TITLE
公司1 JAVA软件工程师,C++软件工程师
公司2 ORACLE开发工程师,ORACLE DBA
simonguo213 2005-05-29
  • 打赏
  • 举报
回复
每个公司所招聘的职位用多个列表示就可以,方法:
select a.COMPANY_NAME , b.JOB_TITLE from 表一 as a
inner join
表二 as b
xiaoxiangqing 2005-05-29
  • 打赏
  • 举报
回复
if exists (select * from sysobjects where object_id('company')=id and objectproperty(id,'isUserTable')=1)
drop table company

if exists (select * from sysobjects where object_id('job')=id and objectproperty(id,'isUserTable')=1)
drop table job
go

create table company(COMPANY_ID int not null identity(1,1) primary key,COMPANY_NAME varchar(50) not null)

create table job(JOB_ID int not null identity(1,1) ,COMPANY_ID int not null,JOB_TITLE varchar(50) null,primary key (JOB_ID,COMPANY_ID))
go

if exists (select * from sysobjects where object_id('fn_company_job')=id and type='FN')
drop function fn_company_job
go

create function fn_company_job(@company_id int)
returns varchar(1000)
as
begin
declare @company_job varchar(1000)
set @company_job=''
select @company_job=@company_job+JOB_TITLE+',' from job where COMPANY_ID=@company_id
if @company_job<>''
set @company_job=left(@company_job,len(@company_job)-1)
return @company_job
end
go

insert into company
select '公司1' union all
select '公司2'

insert into job
select 1,'JAVA軟件工程師' union all
select 1,'C++軟件工程師' union all
select 2,'ORACLE開發工程師' union all
select 2,'ORACLE DBA'
go

select * from company
/*
COMPANY_ID COMPANY_NAME
1 公司1
2 公司2
*/
select * from job
/*
JOB_ID COMPANY_ID JOB_TITLE
1 1 JAVA軟件工程師
2 1 C++軟件工程師
3 2 ORACLE開發工程師
4 2 ORACLE DBA
*/

select COMPANY_NAME,dbo.fn_company_job(COMPANY_ID) JOB_TITLE from company
/*
COMPANY_NAME JOB_TITLE
公司1 JAVA軟件工程師,C++軟件工程師
公司2 ORACLE開發工程師,ORACLE DBA
*/
xiaoxiangqing 2005-05-29
  • 打赏
  • 举报
回复
if exists (select * from sysobjects where object_id('company')=id and objectproperty(id,'isUserTable')=1)
drop table company

if exists (select * from sysobjects where object_id('job')=id and objectproperty(id,'isUserTable')=1)
drop table job
go

create table company(COMPANY_ID int not null identity(1,1) primary key,COMPANY_NAME varchar(50) not null)

create table job(JOB_ID int not null identity(1,1) ,COMPANY_ID int not null,JOB_TITLE varchar(50) null,primary key (JOB_ID,COMPANY_ID))
go

if exists (select * from sysobjects where object_id('fn_company_job')=id and type='FN')
drop function fn_company_job
go

create function fn_company_job(@company_id int)
returns varchar(1000)
as
begin
declare @company_job varchar(1000)
set @company_job=''
select @company_job=@company_job+JOB_TITLE+',' from job where COMPANY_ID=@company_id
if @company_job<>''
set @company_job=left(@company_job,len(@company_job)-1)
return @company_job
end
go

insert into company
select '公司1' union all
select '公司2'

insert into job
select 1,'JAVA軟件工程師' union all
select 1,'C++軟件工程師' union all
select 2,'ORACLE開發工程師' union all
select 2,'ORACLE DBA'
go

select * from company
/*
COMPANY_ID COMPANY_NAME
1 公司1
2 公司2
*/
select * from job
/*
JOB_ID COMPANY_ID JOB_TITLE
1 1 JAVA軟件工程師
2 1 C++軟件工程師
3 2 ORACLE開發工程師
4 2 ORACLE DBA
*/

select COMPANY_NAME,dbo.fn_company_job(COMPANY_ID) from company
Tennal1020 2005-05-29
  • 打赏
  • 举报
回复
freegzc() :谢谢你啊,再想想吧,我也在做尝试。
freegzc 2005-05-29
  • 打赏
  • 举报
回复
帮你想了半天,还是不行!只能用游标了!
Tennal1020 2005-05-29
  • 打赏
  • 举报
回复
我知道通过在存储过程中用游标和临时表也可以实现(并且已经实现了),只是我不想这么麻烦,希望可以用一条SQL语句解决这个问题,高手们快帮帮忙啊
ziping 2005-05-29
  • 打赏
  • 举报
回复
你在CSDN里面搜一吧,我记得是有的
不过好象不是一条SQL语句

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧