当前位置: 代码迷 >> Sql Server >> SQL里怎么才能同字段选择匹配
  详细解决方案

SQL里怎么才能同字段选择匹配

热度:104   发布时间:2016-04-27 12:50:45.0
SQL里如何才能同字段选择匹配
例: 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转换成对应的名字)

  真不知道我有没有说清楚, 求各位大大帮助 


------解决方案--------------------
SQL code
--> 测试数据:[A表]goif object_id('[A表]') is not null drop table [A表]gocreate table [A表]([id] int,[name] varchar(6),[a_sn] varchar(10),[b_sn] varchar(10),[c_sn] varchar(10))goinsert [A表]select 1,'打鱼','1010201','1010200',null union allselect 2,'农家乐','1010301','1010300','1020401' union allselect 3,'打台球','1020402','1020400','1010200'select *from [A表]--> 测试数据:[B表]goif object_id('[B表]') is not nulldrop table [B表]gocreate table [B表]([a_sn] varchar(10),[b_sn] varchar(10),[a_name] varchar(10),[b_name] varchar(6))goinsert [B表]select '1010201','1010200','经管系一班','经管系' union allselect '1010202','1010200','经管系二班','经管系' union allselect '1010301','1010300','通控系一班','通控系' union allselect '1010302','1010300','通控系二班','通控系' union allselect '1020401','1020400','数学系一班','数学系' union allselect '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表])aon [A表].a_sn=a.a_snleft join(select [b_sn],[b_name] from [B表])bon [A表].b_sn=b.b_sn)dleft join( select [a_sn],[a_name] from [B表]union allselect [b_sn],[b_name] from [B表])eon d.[c_sn]=e.a_sn/*id    name    a_name    b_name    c_name1    打鱼    经管系一班    经管系    经管系一班2    农家乐    通控系一班    通控系    数学系一班3    打台球    数学系二班    数学系    经管系*/
  相关解决方案