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
是的
#13
写个自定义函数。
#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
... 呵呵 复制黏贴 确实方便啦。。
#16
你的其他字段也是可以去和另外一张表进行替换的么? 比如说都是名字
#17
?
#18
就是 不用写字段啦。
直接函数粘阿。。不过参数还是要写。。
#19
函数写一下一劳永逸,方便多了
#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
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
#30
#31
表与表之间的连接关键是字段的对应
#32
学习拉!!
#33
mark 学习
#34
学习消化中
#35
强大啊,兄弟们
#36
路过
#37
学习
#38
#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
(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
#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
是的
#13
写个自定义函数。
#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
... 呵呵 复制黏贴 确实方便啦。。
#16
你的其他字段也是可以去和另外一张表进行替换的么? 比如说都是名字
#17
?
#18
就是 不用写字段啦。
直接函数粘阿。。不过参数还是要写。。
#19
函数写一下一劳永逸,方便多了
#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
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
#30
#31
表与表之间的连接关键是字段的对应
#32
学习拉!!
#33
mark 学习
#34
学习消化中
#35
强大啊,兄弟们
#36
路过
#37
学习
#38
#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
(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
#50
很好很强大