例: A表: id, a_sn, b_sn, c_sn
B表: a_sn, b_sn, a_name, b_name 其中: a_sn 在A表和B表中都是一一对应的, b_sn可以对应多个a_sn, a_name和b_name分别是a_sn和b_sn的名字
最重要的就是c_sn, 可以是空, 也可以是a_sn或b_sn 假设这就是一个活动的表. a_sn代表班级, b_sn代表是哪个系, c_sn代表活动的组织者 可以是班级, 也可以是系, 如果c_sn为空的话, 就代表这个活动是由本班级组织的, 即取a_sn的值, 如果不为空, 则由其他的班级或系组织.
现在就是要显示出 活动id, 活动所在班级(即a.name), 活动所有系(即b.name), 活动组织者(即把c_sn转换成对应的名字) 真不知道我有没有说清楚, 求各位大大帮助
B表: a_sn, b_sn, a_name, b_name 其中: a_sn 在A表和B表中都是一一对应的, b_sn可以对应多个a_sn, a_name和b_name分别是a_sn和b_sn的名字
最重要的就是c_sn, 可以是空, 也可以是a_sn或b_sn 假设这就是一个活动的表. a_sn代表班级, b_sn代表是哪个系, c_sn代表活动的组织者 可以是班级, 也可以是系, 如果c_sn为空的话, 就代表这个活动是由本班级组织的, 即取a_sn的值, 如果不为空, 则由其他的班级或系组织.
现在就是要显示出 活动id, 活动所在班级(即a.name), 活动所有系(即b.name), 活动组织者(即把c_sn转换成对应的名字) 真不知道我有没有说清楚, 求各位大大帮助
1 打鱼 1010201 1010200 NULL
2 农家乐 1010301 1010300 1020401
3 打台球 1020402 1020400 1010200B表: a_sn b_sn a_name b_name
1010201 1010200 经管系一班 经管系
1010202 1010200 经管系二班 经管系
1010301 1010300 通控系一班 通控系
1010302 1010300 通控系二班 通控系
1020401 1020400 数学系一班 数学系
1020402 1020400 数学系二班 数学系
不好意思, 还有一点忘记说了, 系别的代码是以0结尾的, 班别代码不以0结尾
比如说结果就是
1 打鱼 经管系一班 经管系 经管系一班
2 农家乐 通控系一班 通控系 数学系一班
3 打台球 数学系二班 数学系 经管系
-- 1 打鱼 1010201 1010200 NULL
-- 2 农家乐 1010301 1010300 1020401
-- 3 打台球 1020402 1020400 1010200--B表: a_sn b_sn a_name b_name
-- 1010201 1010200 经管系一班 经管系
-- 1010202 1010200 经管系二班 经管系
-- 1010301 1010300 通控系一班 通控系
-- 1010302 1010300 通控系二班 通控系
-- 1020401 1020400 数学系一班 数学系
-- 1020402 1020400 数学系二班 数学系declare @A table (id int, name varchar(50), a_sn varchar(50),b_sn varchar(50), c_sn varchar(50))
insert into @A values(1, '打鱼', '1010201', '1010200', NULL )
insert into @A values(2, '农家乐', '1010301', '1010300' ,'1020401')
insert into @A values(3, '打台球', '1020402', '1020400', '1010200' )declare @B table ( a_sn varchar(50), b_sn varchar(50),a_name varchar(50), b_name varchar(50))
insert into @B values('1010201' ,'1010200' ,'经管系一班', '经管系' )
insert into @B values('1010202', '1010200' ,'经管系二班', '经管系' )
insert into @B values('1010301', '1010300', '通控系一班', '通控系' )
insert into @B values('1010302', '1010300', '通控系二班', '通控系' )
insert into @B values('1020401', '1020400' ,'数学系一班', '数学系' )
insert into @B values('1020402', '1020400' ,'数学系二班', '数学系' )
--就是要查询出数据, 把a_sn, b_sn, c_sn都换成对应的名字
--比如说结果就是
-- 1 打鱼 经管系一班 经管系 经管系一班
-- 2 农家乐 通控系一班 通控系 数学系一班
-- 3 打台球 数学系二班 数学系 经管系
select distinct a.id,a.name,b.a_name ,c.b_name from @A a join @B b on a.a_sn=b.a_sn join @B c on a.b_sn=c.b_sn
id name a_name b_name
----------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
1 打鱼 经管系一班 经管系
2 农家乐 通控系一班 通控系
3 打台球 数学系二班 数学系(3 行受影响)
--> 测试数据:[A表]
go
if object_id('[A表]') is not null
drop table [A表]
go
create table [A表](
[id] int,
[name] varchar(6),
[a_sn] varchar(10),
[b_sn] varchar(10),
[c_sn] varchar(10)
)
go
insert [A表]
select 1,'打鱼','1010201','1010200',null union all
select 2,'农家乐','1010301','1010300','1020401' union all
select 3,'打台球','1020402','1020400','1010200'select *from [A表]
--> 测试数据:[B表]
go
if object_id('[B表]') is not null
drop table [B表]
go
create table [B表](
[a_sn] varchar(10),
[b_sn] varchar(10),
[a_name] varchar(10),
[b_name] varchar(6))
go
insert [B表]
select '1010201','1010200','经管系一班','经管系' union all
select '1010202','1010200','经管系二班','经管系' union all
select '1010301','1010300','通控系一班','通控系' union all
select '1010302','1010300','通控系二班','通控系' union all
select '1020401','1020400','数学系一班','数学系' union all
select '1020402','1020400','数学系二班','数学系'
select distinct [id],[name],d.[a_name],[b_name],e.[a_name] as [c_name]
from(
select distinct [id],[name],[a_name],[b_name],
isnull([c_sn],a.[a_sn]) as [c_sn]
from [A表]
left join
(select [a_sn],[a_name] from [B表])a
on [A表].a_sn=a.a_sn
left join
(select [b_sn],[b_name] from [B表])b
on [A表].b_sn=b.b_sn)d
left join(
select [a_sn],[a_name] from [B表]
union all
select [b_sn],[b_name] from [B表])e
on d.[c_sn]=e.a_sn
/*
id name a_name b_name c_name
1 打鱼 经管系一班 经管系 经管系一班
2 农家乐 通控系一班 通控系 数学系一班
3 打台球 数学系二班 数学系 经管系
*/