sql表关联,多条记录合并为一条记录问题,求救!!

时间:2022-10-21 00:25:27
合同表
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     王五    王五   小二    ....
......
请问这样在数据库里将如何实现??关联查询语句该如何写。

77 个解决方案

#1



select  a.id,申请人=b.姓名, 经办人=c.姓名,负责人=d.姓名,a.合同内容
from 合同表 a
left join 人力表  b on a.申请人=b.id 
left join 人力表  c on a.经办人=c.id 
left join 人力表  d on a.负责人=d.id 

#2


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 b
where a.id=b.id

--内连接

select a.id,a.va,b.id,b.vb from @ta a inner join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a join @tb b
on a.id=b.id

--左连接(左外连接)
--返回left join 子句中指定的左表的所有行,以及右表所匹配的行。

select a.id,a.va,b.id,b.vb from @ta a left join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a left outer join @tb b
on a.id=b.id

--右连接(右外连接)
--返回right join 子句中指定的右表的所有行,以及左表所匹配的行。

select a.id,a.va,b.id,b.vb from @ta a right join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a right outer join @tb b
on a.id=b.id

--完整外连接
--等同左连接+右连接

select a.id,a.va,b.id,b.vb from @ta a full join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a full outer join @tb b
on a.id=b.id


--交叉连接
--没有两个表之间关系的交叉连接,将产生连接所涉及的表的笛卡尔积。

select a.id,a.va,b.id,b.vb from @ta a cross join @tb b

select 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



#3




SELECT A.id,B.name AS 申请人,C.name AS 经办人,D.name AS 负责人
FROM 合同表 AS A
    JOIN 人力表 AS B
ON A.申请人=B.id
    JOIN 人力表 AS C
ON A.经办人=C.id
    JOIN 人力表 AS D
ON A.负责人=D.id

#4



---------------------------------
--  Author: htl258(Tony)
--  Date  : 2009-08-02 13:42:15
---------------------------------
--> 生成测试数据表:合同表

If not object_id('[合同表]') is null
Drop table [合同表]
Go
Create table [合同表]([Id] int,[申请人] int,[经办人] int,[负责人] int,[合同内容] nvarchar(10))
Insert 合同表
Select 1,01,02,03,'埃保常' union all
Select 2,03,03,04,'aggressive' union all
Select 3,05,04,05,'嘎嘎' union all
Select 4,02,02,02,'大厦噶尔外国'
Go
--Select * from 合同表

--> 生成测试数据表:人力表

If not object_id('[人力表]') is null
Drop table [人力表]
Go
Create table [人力表]([id] int,[姓名] nvarchar(2))
Insert 人力表
Select 01,'张三' union all
Select 02,'李四' union all
Select 03,'王五' union all
Select 04,'小二' union all
Select 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.id
order by 1
/*
Id          申请人  经办人  负责人  合同内容
----------- ---- ---- ---- ----------
1           张三   李四   王五   埃保常
2           王五   王五   小二   aggressive
3           大傻   小二   大傻   嘎嘎
4           李四   李四   李四   大厦噶尔外国

(4 行受影响)

*/

#5



---------------------------------
--  Author: htl258(Tony)
--  Date  : 2009-08-02 13:42:15
---------------------------------
--> 生成测试数据表:合同表

If not object_id('[合同表]') is null
Drop table [合同表]
Go
Create table [合同表]([Id] int,[申请人] int,[经办人] int,[负责人] int,[合同内容] nvarchar(10))
Insert 合同表
Select 1,01,02,03,'埃保常' union all
Select 2,03,03,04,'aggressive' union all
Select 3,05,04,05,'嘎嘎' union all
Select 4,02,02,02,'大厦噶尔外国'
Go
--Select * from 合同表

--> 生成测试数据表:人力表

If not object_id('[人力表]') is null
Drop table [人力表]
Go
Create table [人力表]([id] int,[姓名] nvarchar(2))
Insert 人力表
Select 01,'张三' union all
Select 02,'李四' union all
Select 03,'王五' union all
Select 04,'小二' union all
Select 05,'大傻'
Go
--Select * from 人力表

-->SQL查询如下:
select Id,
[申请人]=(select 姓名 from 人力表 where id=申请人),
[经办人]=(select 姓名 from 人力表 where id=经办人),
[负责人]=(select 姓名 from 人力表 where id=负责人),
    合同内容
from 合同表

/*
Id          申请人  经办人  负责人  合同内容
----------- ---- ---- ---- ----------
1           张三   李四   王五   埃保常
2           王五   王五   小二   aggressive
3           大傻   小二   大傻   嘎嘎
4           李四   李四   李四   大厦噶尔外国

(4 行受影响)

*/
这样也行

#6


---测试数据---
if object_id('[合同表]') is not null drop table [合同表]
go
create table [合同表]([Id] int,[申请人] varchar(2),[经办人] varchar(2),[负责人] varchar(2),[合同内容] varchar(12))
insert [合同表]
select 1,'01','02','03','埃保常' union all
select 2,'03','03','04','aggressive' union all
select 3,'05','04','05','嘎嘎' union all
select 4,'02','02','02','大厦噶尔外国'
if object_id('[人力表]') is not null drop table [人力表]
go
create table [人力表]([id] varchar(2),[姓名] varchar(4))
insert [人力表]
select '01','张三' union all
select '02','李四' union all
select '03','王五' union all
select '04','小二' union all
select '05','大傻'
 
---查询---
select 
  a.Id,
  b.姓名 as 申请人,
  c.姓名 as 经办人,
  d.姓名 as 负责人,
  a.合同内容
from 
  [合同表] as a
left join
  [人力表] as b on a.申请人=b.id
left join
  [人力表] as c on a.经办人=c.id
left join
  [人力表] as d on a.负责人=d.id

---结果---
Id          申请人  经办人  负责人  合同内容         
----------- ---- ---- ---- ------------ 
1           张三   李四   王五   埃保常
2           王五   王五   小二   aggressive
3           大傻   小二   大傻   嘎嘎
4           李四   李四   李四   大厦噶尔外国

(所影响的行数为 4 行)

#7


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 @合同表 a
left join @人力表  b on a.申请人=b.id 
left join @人力表  c on a.经办人=c.id 
left join @人力表  d on a.负责人=d.id 

/*
id          申请人        经办人        负责人        合同内容                 
----------- ---------- ---------- ---------- -------------------- 
1           张三         李四         王五         埃保常
2           王五         王五         小二         aggressive
3           大傻         小二         大傻         嘎嘎
4           李四         李四         李四         大厦噶尔外国

(所影响的行数为 4 行)
*/

#8


select Id,
    申请人=(select 姓名 from 人力表 where id=申请人),
    经办人=(select 姓名 from 人力表 where id=经办人),
    负责人=(select 姓名 from 人力表 where id=负责人),
    合同内容
from 合同表

#9


学习

#10


现在要用合同表关联人力,将同一条合同只显示一次...
这句话 有点意思。。
只显示一次 你的意思就是并表吧。。

#11


合同表里还有好多的字段呢,如果像这样a.合同内容,a.id等等,每个字段都要写一遍挺麻烦的,有没有更方便,简单的书写方法?

#12


引用 10 楼 feixianxxx 的回复:
现在要用合同表关联人力,将同一条合同只显示一次...
这句话 有点意思。。
只显示一次 你的意思就是并表吧。。

是的

#13


引用 12 楼 div_css 的回复:
引用 10 楼 feixianxxx 的回复:
现在要用合同表关联人力,将同一条合同只显示一次...
这句话 有点意思。。
只显示一次 你的意思就是并表吧。。

是的

写个自定义函数。

#14


--> 生成测试数据表:合同表

If not object_id('[合同表]') is null
Drop table [合同表]
Go
Create table [合同表]([Id] int,[申请人] nvarchar(2),[经办人] nvarchar(2),[负责人] nvarchar(2),[合同内容] nvarchar(10))
Insert 合同表
Select 1,'01','02','03','埃保常' union all
Select 2,'03','03','04','aggressive' union all
Select 3,'05','04','05','嘎嘎' union all
Select 4,'02','02','02','大厦噶尔外国'
Go
--Select * from 合同表

--> 生成测试数据表:人力表

If not object_id('[人力表]') is null
Drop table [人力表]
Go
Create table [人力表]([id] nvarchar(2),[姓名] nvarchar(2))
Insert 人力表
Select '01','张三' union all
Select '02','李四' union all
Select '03','王五' union all
Select '04','小二' union all
Select '05','大傻'
Go
--Select * from 人力表

-->SQL查询如下:
create function f_name(@id nvarchar(10))
returns nvarchar(10)
as
begin
    return(select 姓名 from 人力表 where id=@id)
end
go
select Id,
[申请人]=dbo.f_name(申请人),
[经办人]=dbo.f_name(经办人),
[负责人]=dbo.f_name(负责人),
    合同内容
from 合同表

/*
Id          申请人  经办人  负责人  合同内容
----------- ---- ---- ---- ----------
1           张三   李四   王五   埃保常
2           王五   王五   小二   aggressive
3           大傻   小二   大傻   嘎嘎
4           李四   李四   李四   大厦噶尔外国

(4 行受影响)

#15


引用 14 楼 htl258 的回复:
SQL code--> 生成测试数据表:合同表Ifnotobject_id('[合同表]')isnullDroptable[合同表]GoCreatetable[合同表]([Id]int,[申请人]nvarchar(2),[经办人]nvarchar(2),[负责人]nvarchar(2),[合同内容]nvarchar(10))Insert 合同表Select1,'01','02','03','埃保常¡­

... 呵呵 复制黏贴 确实方便啦。。

#16


引用 11 楼 div_css 的回复:
合同表里还有好多的字段呢,如果像这样a.合同内容,a.id等等,每个字段都要写一遍挺麻烦的,有没有更方便,简单的书写方法?

你的其他字段也是可以去和另外一张表进行替换的么? 比如说都是名字

#17


引用 15 楼 feixianxxx 的回复:
引用 14 楼 htl258 的回复:
SQL code--> 生成测试数据表:合同表Ifnotobject_id('[合同表]')isnullDroptable[合同表]GoCreatetable[合同表]([Id]int,[申请人]nvarchar(2),[经办人]nvarchar(2),[负责人]nvarchar(2),[合同内容]nvarchar(10))Insert 合同表Select1,'01','02','03','埃保常¡­

... 呵呵 复制黏贴 确实方便啦。。

#18


引用 17 楼 htl258 的回复:
引用 15 楼 feixianxxx 的回复:
引用 14 楼 htl258 的回复:
SQL code--> 生成测试数据表:合同表Ifnotobject_id('[合同表]')isnullDroptable[合同表]GoCreatetable[合同表]([Id]int,[申请人]nvarchar(2),[经办人]nvarchar(2),[负责人]nvarchar(2),[合同内容]nvarchar(10))Insert 合同表Select1,'01','02','03','埃保常¡­

... 呵呵 复制黏贴 确实方便啦。。


就是 不用写字段啦。
直接函数粘阿。。不过参数还是要写。。

#19


引用 18 楼 feixianxxx 的回复:
引用 17 楼 htl258 的回复:
引用 15 楼 feixianxxx 的回复:
引用 14 楼 htl258 的回复:
SQL code--> 生成测试数据表:合同表Ifnotobject_id('[合同表]')isnullDroptable[合同表]GoCreatetable[合同表]([Id]int,[申请人]nvarchar(2),[经办人]nvarchar(2),[负责人]nvarchar(2),[合同内容]nvarchar(10))Insert 合同表Select1,'01','02','03','埃保常¡­

... 呵呵 复制黏贴 确实方便啦。。



就是 不用写字段啦。
直接函数粘阿。。不过参数还是要写。。

函数写一下一劳永逸,方便多了

#20


select a.Id,b.姓名,c.姓名,d.姓名,a.合同内容
from 合同表 a join 人力表 b
      on a.申请人=b.id
      join 人力表 c
      on a.经办人=c.id
      join 人力表 d
      on a.负责人=d.id

#21


左连left join

select a.Id,b.姓名,c.姓名,d.姓名,a.合同内容
from 合同表 a left join 人力表 b
      on a.申请人=b.id
      left join 人力表 c
      on a.经办人=c.id
      left join 人力表 d
      on a.负责人=d.id

#22


给你一个取表所有字段的语句,以后只需复制、粘贴就可以了。
declare @sql varchar(2000)
set @sql=''
select @sql=@sql+a.name+',' from syscolumns a,sysobjects b 
where a.id=b.id and b.xtype='u' and b.name='tablename' order by a.colorder
set @sql=left(@sql,len(@sql)-1)
print @sql

楼主真是懒人啊。^_^

#23


都是牛人啊

#24


xuexi

#25



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 b
where a.id=b.id

--内连接

select a.id,a.va,b.id,b.vb from @ta a inner join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a join @tb b
on a.id=b.id

--左连接(左外连接)
--返回left join 子句中指定的左表的所有行,以及右表所匹配的行。

select a.id,a.va,b.id,b.vb from @ta a left join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a left outer join @tb b
on a.id=b.id

--右连接(右外连接)
--返回right join 子句中指定的右表的所有行,以及左表所匹配的行。

select a.id,a.va,b.id,b.vb from @ta a right join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a right outer join @tb b
on a.id=b.id

--完整外连接
--等同左连接+右连接

select a.id,a.va,b.id,b.vb from @ta a full join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a full outer join @tb b
on a.id=b.id


--交叉连接
--没有两个表之间关系的交叉连接,将产生连接所涉及的表的笛卡尔积。

select a.id,a.va,b.id,b.vb from @ta a cross join @tb b

select 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

#26


学习

#27


关注,学习!!

#28


mark

#29


该回复于2009-09-01 10:41:40被版主删除

#30


该回复于2009-08-08 10:06:09被版主删除

#31


表与表之间的连接关键是字段的对应

#32


学习拉!!

#33


mark 学习

#34


学习消化中

#35


强大啊,兄弟们

#36


路过

#37


学习

#38


该回复于2009-08-04 10:54:43被版主删除

#39


看不懂

#40


2,3楼写的很详细了~~LZ借鉴吧

#41


消化过程中

#42


#43


学习

#44


mark~~

#45


up.

#46


up...

#47


select a.PkID, b.name as ApplyEmployee,c.name as DealEmployee,d.name as Charger,a.Content from
(select min(PkId) as PkId, ApplyEmployeeId,DealEmployeeId,ChargerId,Content
from tblHeTong group by ApplyEmployeeId,DealEmployeeId,ChargerId,Content) a
left join tblEmployee b on a.ApplyEmployeeId = b.EmployeeId
left join tblEmployee c on a.DealEmployeeId = c.EmployeeId
left join tblEmployee d on a.ChargerId = d.EmployeeId
order by PkId

#48


函数

#49


该回复于2009-08-04 11:21:46被版主删除

#50


很好很强大

#1



select  a.id,申请人=b.姓名, 经办人=c.姓名,负责人=d.姓名,a.合同内容
from 合同表 a
left join 人力表  b on a.申请人=b.id 
left join 人力表  c on a.经办人=c.id 
left join 人力表  d on a.负责人=d.id 

#2


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 b
where a.id=b.id

--内连接

select a.id,a.va,b.id,b.vb from @ta a inner join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a join @tb b
on a.id=b.id

--左连接(左外连接)
--返回left join 子句中指定的左表的所有行,以及右表所匹配的行。

select a.id,a.va,b.id,b.vb from @ta a left join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a left outer join @tb b
on a.id=b.id

--右连接(右外连接)
--返回right join 子句中指定的右表的所有行,以及左表所匹配的行。

select a.id,a.va,b.id,b.vb from @ta a right join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a right outer join @tb b
on a.id=b.id

--完整外连接
--等同左连接+右连接

select a.id,a.va,b.id,b.vb from @ta a full join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a full outer join @tb b
on a.id=b.id


--交叉连接
--没有两个表之间关系的交叉连接,将产生连接所涉及的表的笛卡尔积。

select a.id,a.va,b.id,b.vb from @ta a cross join @tb b

select 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



#3




SELECT A.id,B.name AS 申请人,C.name AS 经办人,D.name AS 负责人
FROM 合同表 AS A
    JOIN 人力表 AS B
ON A.申请人=B.id
    JOIN 人力表 AS C
ON A.经办人=C.id
    JOIN 人力表 AS D
ON A.负责人=D.id

#4



---------------------------------
--  Author: htl258(Tony)
--  Date  : 2009-08-02 13:42:15
---------------------------------
--> 生成测试数据表:合同表

If not object_id('[合同表]') is null
Drop table [合同表]
Go
Create table [合同表]([Id] int,[申请人] int,[经办人] int,[负责人] int,[合同内容] nvarchar(10))
Insert 合同表
Select 1,01,02,03,'埃保常' union all
Select 2,03,03,04,'aggressive' union all
Select 3,05,04,05,'嘎嘎' union all
Select 4,02,02,02,'大厦噶尔外国'
Go
--Select * from 合同表

--> 生成测试数据表:人力表

If not object_id('[人力表]') is null
Drop table [人力表]
Go
Create table [人力表]([id] int,[姓名] nvarchar(2))
Insert 人力表
Select 01,'张三' union all
Select 02,'李四' union all
Select 03,'王五' union all
Select 04,'小二' union all
Select 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.id
order by 1
/*
Id          申请人  经办人  负责人  合同内容
----------- ---- ---- ---- ----------
1           张三   李四   王五   埃保常
2           王五   王五   小二   aggressive
3           大傻   小二   大傻   嘎嘎
4           李四   李四   李四   大厦噶尔外国

(4 行受影响)

*/

#5



---------------------------------
--  Author: htl258(Tony)
--  Date  : 2009-08-02 13:42:15
---------------------------------
--> 生成测试数据表:合同表

If not object_id('[合同表]') is null
Drop table [合同表]
Go
Create table [合同表]([Id] int,[申请人] int,[经办人] int,[负责人] int,[合同内容] nvarchar(10))
Insert 合同表
Select 1,01,02,03,'埃保常' union all
Select 2,03,03,04,'aggressive' union all
Select 3,05,04,05,'嘎嘎' union all
Select 4,02,02,02,'大厦噶尔外国'
Go
--Select * from 合同表

--> 生成测试数据表:人力表

If not object_id('[人力表]') is null
Drop table [人力表]
Go
Create table [人力表]([id] int,[姓名] nvarchar(2))
Insert 人力表
Select 01,'张三' union all
Select 02,'李四' union all
Select 03,'王五' union all
Select 04,'小二' union all
Select 05,'大傻'
Go
--Select * from 人力表

-->SQL查询如下:
select Id,
[申请人]=(select 姓名 from 人力表 where id=申请人),
[经办人]=(select 姓名 from 人力表 where id=经办人),
[负责人]=(select 姓名 from 人力表 where id=负责人),
    合同内容
from 合同表

/*
Id          申请人  经办人  负责人  合同内容
----------- ---- ---- ---- ----------
1           张三   李四   王五   埃保常
2           王五   王五   小二   aggressive
3           大傻   小二   大傻   嘎嘎
4           李四   李四   李四   大厦噶尔外国

(4 行受影响)

*/
这样也行

#6


---测试数据---
if object_id('[合同表]') is not null drop table [合同表]
go
create table [合同表]([Id] int,[申请人] varchar(2),[经办人] varchar(2),[负责人] varchar(2),[合同内容] varchar(12))
insert [合同表]
select 1,'01','02','03','埃保常' union all
select 2,'03','03','04','aggressive' union all
select 3,'05','04','05','嘎嘎' union all
select 4,'02','02','02','大厦噶尔外国'
if object_id('[人力表]') is not null drop table [人力表]
go
create table [人力表]([id] varchar(2),[姓名] varchar(4))
insert [人力表]
select '01','张三' union all
select '02','李四' union all
select '03','王五' union all
select '04','小二' union all
select '05','大傻'
 
---查询---
select 
  a.Id,
  b.姓名 as 申请人,
  c.姓名 as 经办人,
  d.姓名 as 负责人,
  a.合同内容
from 
  [合同表] as a
left join
  [人力表] as b on a.申请人=b.id
left join
  [人力表] as c on a.经办人=c.id
left join
  [人力表] as d on a.负责人=d.id

---结果---
Id          申请人  经办人  负责人  合同内容         
----------- ---- ---- ---- ------------ 
1           张三   李四   王五   埃保常
2           王五   王五   小二   aggressive
3           大傻   小二   大傻   嘎嘎
4           李四   李四   李四   大厦噶尔外国

(所影响的行数为 4 行)

#7


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 @合同表 a
left join @人力表  b on a.申请人=b.id 
left join @人力表  c on a.经办人=c.id 
left join @人力表  d on a.负责人=d.id 

/*
id          申请人        经办人        负责人        合同内容                 
----------- ---------- ---------- ---------- -------------------- 
1           张三         李四         王五         埃保常
2           王五         王五         小二         aggressive
3           大傻         小二         大傻         嘎嘎
4           李四         李四         李四         大厦噶尔外国

(所影响的行数为 4 行)
*/

#8


select Id,
    申请人=(select 姓名 from 人力表 where id=申请人),
    经办人=(select 姓名 from 人力表 where id=经办人),
    负责人=(select 姓名 from 人力表 where id=负责人),
    合同内容
from 合同表

#9


学习

#10


现在要用合同表关联人力,将同一条合同只显示一次...
这句话 有点意思。。
只显示一次 你的意思就是并表吧。。

#11


合同表里还有好多的字段呢,如果像这样a.合同内容,a.id等等,每个字段都要写一遍挺麻烦的,有没有更方便,简单的书写方法?

#12


引用 10 楼 feixianxxx 的回复:
现在要用合同表关联人力,将同一条合同只显示一次...
这句话 有点意思。。
只显示一次 你的意思就是并表吧。。

是的

#13


引用 12 楼 div_css 的回复:
引用 10 楼 feixianxxx 的回复:
现在要用合同表关联人力,将同一条合同只显示一次...
这句话 有点意思。。
只显示一次 你的意思就是并表吧。。

是的

写个自定义函数。

#14


--> 生成测试数据表:合同表

If not object_id('[合同表]') is null
Drop table [合同表]
Go
Create table [合同表]([Id] int,[申请人] nvarchar(2),[经办人] nvarchar(2),[负责人] nvarchar(2),[合同内容] nvarchar(10))
Insert 合同表
Select 1,'01','02','03','埃保常' union all
Select 2,'03','03','04','aggressive' union all
Select 3,'05','04','05','嘎嘎' union all
Select 4,'02','02','02','大厦噶尔外国'
Go
--Select * from 合同表

--> 生成测试数据表:人力表

If not object_id('[人力表]') is null
Drop table [人力表]
Go
Create table [人力表]([id] nvarchar(2),[姓名] nvarchar(2))
Insert 人力表
Select '01','张三' union all
Select '02','李四' union all
Select '03','王五' union all
Select '04','小二' union all
Select '05','大傻'
Go
--Select * from 人力表

-->SQL查询如下:
create function f_name(@id nvarchar(10))
returns nvarchar(10)
as
begin
    return(select 姓名 from 人力表 where id=@id)
end
go
select Id,
[申请人]=dbo.f_name(申请人),
[经办人]=dbo.f_name(经办人),
[负责人]=dbo.f_name(负责人),
    合同内容
from 合同表

/*
Id          申请人  经办人  负责人  合同内容
----------- ---- ---- ---- ----------
1           张三   李四   王五   埃保常
2           王五   王五   小二   aggressive
3           大傻   小二   大傻   嘎嘎
4           李四   李四   李四   大厦噶尔外国

(4 行受影响)

#15


引用 14 楼 htl258 的回复:
SQL code--> 生成测试数据表:合同表Ifnotobject_id('[合同表]')isnullDroptable[合同表]GoCreatetable[合同表]([Id]int,[申请人]nvarchar(2),[经办人]nvarchar(2),[负责人]nvarchar(2),[合同内容]nvarchar(10))Insert 合同表Select1,'01','02','03','埃保常¡­

... 呵呵 复制黏贴 确实方便啦。。

#16


引用 11 楼 div_css 的回复:
合同表里还有好多的字段呢,如果像这样a.合同内容,a.id等等,每个字段都要写一遍挺麻烦的,有没有更方便,简单的书写方法?

你的其他字段也是可以去和另外一张表进行替换的么? 比如说都是名字

#17


引用 15 楼 feixianxxx 的回复:
引用 14 楼 htl258 的回复:
SQL code--> 生成测试数据表:合同表Ifnotobject_id('[合同表]')isnullDroptable[合同表]GoCreatetable[合同表]([Id]int,[申请人]nvarchar(2),[经办人]nvarchar(2),[负责人]nvarchar(2),[合同内容]nvarchar(10))Insert 合同表Select1,'01','02','03','埃保常¡­

... 呵呵 复制黏贴 确实方便啦。。

#18


引用 17 楼 htl258 的回复:
引用 15 楼 feixianxxx 的回复:
引用 14 楼 htl258 的回复:
SQL code--> 生成测试数据表:合同表Ifnotobject_id('[合同表]')isnullDroptable[合同表]GoCreatetable[合同表]([Id]int,[申请人]nvarchar(2),[经办人]nvarchar(2),[负责人]nvarchar(2),[合同内容]nvarchar(10))Insert 合同表Select1,'01','02','03','埃保常¡­

... 呵呵 复制黏贴 确实方便啦。。


就是 不用写字段啦。
直接函数粘阿。。不过参数还是要写。。

#19


引用 18 楼 feixianxxx 的回复:
引用 17 楼 htl258 的回复:
引用 15 楼 feixianxxx 的回复:
引用 14 楼 htl258 的回复:
SQL code--> 生成测试数据表:合同表Ifnotobject_id('[合同表]')isnullDroptable[合同表]GoCreatetable[合同表]([Id]int,[申请人]nvarchar(2),[经办人]nvarchar(2),[负责人]nvarchar(2),[合同内容]nvarchar(10))Insert 合同表Select1,'01','02','03','埃保常¡­

... 呵呵 复制黏贴 确实方便啦。。



就是 不用写字段啦。
直接函数粘阿。。不过参数还是要写。。

函数写一下一劳永逸,方便多了

#20


select a.Id,b.姓名,c.姓名,d.姓名,a.合同内容
from 合同表 a join 人力表 b
      on a.申请人=b.id
      join 人力表 c
      on a.经办人=c.id
      join 人力表 d
      on a.负责人=d.id

#21


左连left join

select a.Id,b.姓名,c.姓名,d.姓名,a.合同内容
from 合同表 a left join 人力表 b
      on a.申请人=b.id
      left join 人力表 c
      on a.经办人=c.id
      left join 人力表 d
      on a.负责人=d.id

#22


给你一个取表所有字段的语句,以后只需复制、粘贴就可以了。
declare @sql varchar(2000)
set @sql=''
select @sql=@sql+a.name+',' from syscolumns a,sysobjects b 
where a.id=b.id and b.xtype='u' and b.name='tablename' order by a.colorder
set @sql=left(@sql,len(@sql)-1)
print @sql

楼主真是懒人啊。^_^

#23


都是牛人啊

#24


xuexi

#25



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 b
where a.id=b.id

--内连接

select a.id,a.va,b.id,b.vb from @ta a inner join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a join @tb b
on a.id=b.id

--左连接(左外连接)
--返回left join 子句中指定的左表的所有行,以及右表所匹配的行。

select a.id,a.va,b.id,b.vb from @ta a left join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a left outer join @tb b
on a.id=b.id

--右连接(右外连接)
--返回right join 子句中指定的右表的所有行,以及左表所匹配的行。

select a.id,a.va,b.id,b.vb from @ta a right join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a right outer join @tb b
on a.id=b.id

--完整外连接
--等同左连接+右连接

select a.id,a.va,b.id,b.vb from @ta a full join @tb b
on a.id=b.id

select a.id,a.va,b.id,b.vb from @ta a full outer join @tb b
on a.id=b.id


--交叉连接
--没有两个表之间关系的交叉连接,将产生连接所涉及的表的笛卡尔积。

select a.id,a.va,b.id,b.vb from @ta a cross join @tb b

select 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

#26


学习

#27


关注,学习!!

#28


mark

#29


该回复于2009-09-01 10:41:40被版主删除

#30


该回复于2009-08-08 10:06:09被版主删除

#31


表与表之间的连接关键是字段的对应

#32


学习拉!!

#33


mark 学习

#34


学习消化中

#35


强大啊,兄弟们

#36


路过

#37


学习

#38


该回复于2009-08-04 10:54:43被版主删除

#39


看不懂

#40


2,3楼写的很详细了~~LZ借鉴吧

#41


消化过程中

#42


#43


学习

#44


mark~~

#45


up.

#46


up...

#47


select a.PkID, b.name as ApplyEmployee,c.name as DealEmployee,d.name as Charger,a.Content from
(select min(PkId) as PkId, ApplyEmployeeId,DealEmployeeId,ChargerId,Content
from tblHeTong group by ApplyEmployeeId,DealEmployeeId,ChargerId,Content) a
left join tblEmployee b on a.ApplyEmployeeId = b.EmployeeId
left join tblEmployee c on a.DealEmployeeId = c.EmployeeId
left join tblEmployee d on a.ChargerId = d.EmployeeId
order by PkId

#48


函数

#49


该回复于2009-08-04 11:21:46被版主删除

#50


很好很强大