sql表关联,多条记录合并为一条记录问题,求救!!
合同表
Id 申请人 经办人 负责人 合同内容
1 01 02 03 埃保常
2 03 03 04 aggressive
3 05 04 05 嘎嘎
4 02 02 02 大厦噶尔外国
人力表
id 姓名
01 张三
02 李四
03 王五
04 小二
05 大傻
......
现在要用合同表关联人力,将同一条合同只显示一次。比如
1 张三 李四 王五 ....
2 王五 王五 小二 ....
......
请问这样在数据库里将如何实现??关联查询语句该如何写。
[解决办法]
select a.id,申请人=b.姓名, 经办人=c.姓名,负责人=d.姓名,a.合同内容from 合同表 aleft join 人力表 b on a.申请人=b.id left join 人力表 c on a.经办人=c.id left join 人力表 d on a.负责人=d.id
[解决办法]
declare @ta table (id int,va varchar(10))declare @tb table (id int,vb varchar(10))insert into @ta select 1,'aa' insert into @ta select 2,'bc' insert into @ta select 3,'ccc'insert into @tb select 1,'2'insert into @tb select 3,'58' insert into @tb select 4,'67' --内连接简单写法select a.id,a.va,b.id,b.vb from @ta a,@tb bwhere a.id=b.id--内连接select a.id,a.va,b.id,b.vb from @ta a inner join @tb bon a.id=b.idselect a.id,a.va,b.id,b.vb from @ta a join @tb bon a.id=b.id--左连接(左外连接)--返回left join 子句中指定的左表的所有行,以及右表所匹配的行。select a.id,a.va,b.id,b.vb from @ta a left join @tb bon a.id=b.idselect a.id,a.va,b.id,b.vb from @ta a left outer join @tb bon a.id=b.id--右连接(右外连接)--返回right join 子句中指定的右表的所有行,以及左表所匹配的行。select a.id,a.va,b.id,b.vb from @ta a right join @tb bon a.id=b.idselect a.id,a.va,b.id,b.vb from @ta a right outer join @tb bon a.id=b.id--完整外连接--等同左连接+右连接select a.id,a.va,b.id,b.vb from @ta a full join @tb bon a.id=b.idselect a.id,a.va,b.id,b.vb from @ta a full outer join @tb bon a.id=b.id--交叉连接--没有两个表之间关系的交叉连接,将产生连接所涉及的表的笛卡尔积。select a.id,a.va,b.id,b.vb from @ta a cross join @tb bselect a.id,a.va,b.id,b.vb from @ta a,@tb b--自连接--一个表和其本身连接。select a.id,a.va,b.id,b.va from @ta a,@ta b where a.id=b.id+1
[解决办法]
SELECT A.id,B.name AS 申请人,C.name AS 经办人,D.name AS 负责人FROM 合同表 AS A JOIN 人力表 AS BON A.申请人=B.id JOIN 人力表 AS CON A.经办人=C.id JOIN 人力表 AS DON A.负责人=D.id
[解决办法]
----------------------------------- Author: htl258(Tony)-- Date : 2009-08-02 13:42:15-----------------------------------> 生成测试数据表:合同表If not object_id('[合同表]') is null Drop table [合同表]GoCreate table [合同表]([Id] int,[申请人] int,[经办人] int,[负责人] int,[合同内容] nvarchar(10))Insert 合同表Select 1,01,02,03,'埃保常' union allSelect 2,03,03,04,'aggressive' union allSelect 3,05,04,05,'嘎嘎' union allSelect 4,02,02,02,'大厦噶尔外国'Go--Select * from 合同表--> 生成测试数据表:人力表If not object_id('[人力表]') is null Drop table [人力表]GoCreate table [人力表]([id] int,[姓名] nvarchar(2))Insert 人力表Select 01,'张三' union allSelect 02,'李四' union allSelect 03,'王五' union allSelect 04,'小二' union allSelect 05,'大傻'Go--Select * from 人力表-->SQL查询如下:select a.Id,b.[姓名] [申请人],c.姓名 [经办人],d.姓名 [负责人],合同内容from 合同表 a join 人力表 b on a.申请人=b.id join 人力表 c on a.经办人=c.id join 人力表 d on a.负责人=d.idorder by 1/*Id 申请人 经办人 负责人 合同内容----------- ---- ---- ---- ----------1 张三 李四 王五 埃保常2 王五 王五 小二 aggressive3 大傻 小二 大傻 嘎嘎4 李四 李四 李四 大厦噶尔外国(4 行受影响)*/
[解决办法]
----------------------------------- Author: htl258(Tony)-- Date : 2009-08-02 13:42:15-----------------------------------> 生成测试数据表:合同表If not object_id('[合同表]') is null Drop table [合同表]GoCreate table [合同表]([Id] int,[申请人] int,[经办人] int,[负责人] int,[合同内容] nvarchar(10))Insert 合同表Select 1,01,02,03,'埃保常' union allSelect 2,03,03,04,'aggressive' union allSelect 3,05,04,05,'嘎嘎' union allSelect 4,02,02,02,'大厦噶尔外国'Go--Select * from 合同表--> 生成测试数据表:人力表If not object_id('[人力表]') is null Drop table [人力表]GoCreate table [人力表]([id] int,[姓名] nvarchar(2))Insert 人力表Select 01,'张三' union allSelect 02,'李四' union allSelect 03,'王五' union allSelect 04,'小二' union allSelect 05,'大傻'Go--Select * from 人力表-->SQL查询如下:select Id, [申请人]=(select 姓名 from 人力表 where id=申请人), [经办人]=(select 姓名 from 人力表 where id=经办人), [负责人]=(select 姓名 from 人力表 where id=负责人), 合同内容from 合同表/*Id 申请人 经办人 负责人 合同内容----------- ---- ---- ---- ----------1 张三 李四 王五 埃保常2 王五 王五 小二 aggressive3 大傻 小二 大傻 嘎嘎4 李四 李四 李四 大厦噶尔外国(4 行受影响)*/
[解决办法]
---测试数据---if object_id('[合同表]') is not null drop table [合同表]gocreate table [合同表]([Id] int,[申请人] varchar(2),[经办人] varchar(2),[负责人] varchar(2),[合同内容] varchar(12))insert [合同表]select 1,'01','02','03','埃保常' union allselect 2,'03','03','04','aggressive' union allselect 3,'05','04','05','嘎嘎' union allselect 4,'02','02','02','大厦噶尔外国'if object_id('[人力表]') is not null drop table [人力表]gocreate table [人力表]([id] varchar(2),[姓名] varchar(4))insert [人力表]select '01','张三' union allselect '02','李四' union allselect '03','王五' union allselect '04','小二' union allselect '05','大傻' ---查询---select a.Id, b.姓名 as 申请人, c.姓名 as 经办人, d.姓名 as 负责人, a.合同内容from [合同表] as aleft join [人力表] as b on a.申请人=b.idleft join [人力表] as c on a.经办人=c.idleft join [人力表] as d on a.负责人=d.id---结果---Id 申请人 经办人 负责人 合同内容 ----------- ---- ---- ---- ------------ 1 张三 李四 王五 埃保常2 王五 王五 小二 aggressive3 大傻 小二 大傻 嘎嘎4 李四 李四 李四 大厦噶尔外国(所影响的行数为 4 行)
[解决办法]
declare @合同表 table(Id int, 申请人 varchar(2) , 经办人 varchar(2), 负责人 varchar(2) ,合同内容 varchar(20))insert @合同表 select 1 , '01' , '02' , '03' , '埃保常' insert @合同表 select 2 , '03' , '03' , '04' , 'aggressive' insert @合同表 select 3 , '05' , '04' , '05' , '嘎嘎' insert @合同表 select 4 , '02' , '02' , '02' , '大厦噶尔外国' declare @人力表 table(id int, 姓名 varchar(10))insert @人力表 select '01' , '张三' insert @人力表 select '02' , '李四' insert @人力表 select '03' , '王五' insert @人力表 select '04' , '小二' insert @人力表 select '05' , '大傻' select a.id,申请人=b.姓名, 经办人=c.姓名,负责人=d.姓名,a.合同内容from @合同表 aleft join @人力表 b on a.申请人=b.id left join @人力表 c on a.经办人=c.id left join @人力表 d on a.负责人=d.id /*id 申请人 经办人 负责人 合同内容 ----------- ---------- ---------- ---------- -------------------- 1 张三 李四 王五 埃保常2 王五 王五 小二 aggressive3 大傻 小二 大傻 嘎嘎4 李四 李四 李四 大厦噶尔外国(所影响的行数为 4 行)*/
[解决办法]
select Id, 申请人=(select 姓名 from 人力表 where id=申请人), 经办人=(select 姓名 from 人力表 where id=经办人), 负责人=(select 姓名 from 人力表 where id=负责人), 合同内容from 合同表