日期:2014-05-18  浏览次数:20551 次

在查询主表时同时查询子表的数据(主表:子多=1:N)
我的需求是这样一种情形:假设有两个表、公司信息表、和主管表。一个公司有多个主管。现在我需要查询公司信息列表的时候把公司的相应的所有主管姓名和电话,以一定的规则(比较字符串)作为一个字段提取出来。这样的SQL语句如何写?大概需要自定义函数。其实这个问题压着很多了。曾经由于不能解决该问题,我采用了最笨的办法,就是在公司表中建一个字段(分割字符串)替代主管表。

------解决方案--------------------
SQL code
create table 公司信息表(id int,公司名称 varchar(10),其他信息 varchar(10))
insert into 公司信息表 select 1,'aaa','aaaaaa'
insert into 公司信息表 select 2,'bbb','bbbbbb'
create table 主管表(id int,主管姓名 nvarchar(10),电话 varchar(11),公司id int)
insert into 主管表 select 1,'abc','389432409',1
insert into 主管表 select 2,'def','546546656',1
insert into 主管表 select 3,'iwe','515454654',2
go
select a.公司名称,stuff((select '; '+主管姓名+','+电话 from 主管表 where 公司id=a.id for xml path('')),1,1,'')主管信息
from 公司信息表 a inner join 主管表 b on a.id=b.公司id
group by a.id,a.公司名称
/*
公司名称       主管信息
---------- ----------------------------------------------------------------------------------------------------------------
aaa         abc,389432409; def,546546656
bbb         iwe,515454654

(2 行受影响)
*/
go
drop table 公司信息表,主管表