当前位置: 代码迷 >> Sql Server >> 求一条sql语句!该如何解决
  详细解决方案

求一条sql语句!该如何解决

热度:89   发布时间:2016-04-24 19:22:13.0
求一条sql语句!!!
我有两个表:
A表有两个字段  ano, aname
              P01   上学
              P02   下课
              P03   上课
              P04   放学
B表有5个字段:bid,  b1,  b2,  b3,  b4
             1     P01  P04   P02  P03  
             2     P02  P03   P04  P01

显示B表的时候需要将里面的编号(P01 ano)全部换成A表中的aname 

这语句要怎么写?

------解决方案--------------------

WITH A (ano,aname) AS
(
SELECT 'P01','上学' UNION ALL
SELECT 'P02','下课' UNION ALL
SELECT 'P03','上课' UNION ALL
SELECT 'P04','放学'
)
,B (bid,  b1,  b2,  b3,  b4) AS
(
SELECT 1,'P01','P04','P02','P03' UNION ALL 
SELECT 2,'P02','P03','P04','P01'
)
SELECT bid
,(SELECT aname FROM A WHERE ano=B.b1) b1
,(SELECT aname FROM A WHERE ano=B.b2) b2
,(SELECT aname FROM A WHERE ano=B.b3) b3
,(SELECT aname FROM A WHERE ano=B.b4) b4
FROM B

------解决方案--------------------
下面,分析一下关联表,和子查询,这2种方式的效率:



--drop table A
--drop table B

create table A(ano varchar(20), aname varchar(20))

insert into A
select 'P01',   '上学' union all
select 'P02',   '下课' union all
select 'P03',   '上课' union all
select 'P04',   '放学'


create table B(
bid int,
b1 varchar(20),  
b2 varchar(20),  
b3 varchar(20),  
b4 varchar(20)
)
insert into B
select 1  ,   'P01',  'P04',   'P02',  'P03'   union all
select 2  ,   'P02',  'P03',   'P04',  'P01'


set statistics io on

--方法1,关联表
select b.bid,
       a1.aname as b1,
       a2.aname as b2,
       a3.aname as b3,
       a4.aname as b4
       
from B
left join A a1
       on b.b1 = a1.ano
left join A a2
       on b.b2 = a2.ano
left join A a3
       on b.b3 = a3.ano
left join A a4
       on b.b4 = a4.ano
/*
bid aname aname aname aname
1 上学     放学     下课     上课
2 下课     上课     放学     上学
*/


--方法2,引用了上面的代码,子查询
SELECT bid
,(SELECT aname FROM A WHERE ano=B.b1) b1
,(SELECT aname FROM A WHERE ano=B.b2) b2
,(SELECT aname FROM A WHERE ano=B.b3) b3
,(SELECT aname FROM A WHERE ano=B.b4) b4
FROM B



下面是2个方法的执行计划,从执行计划来看,每个执行计划的开销,都占了50%,基本上来说两者的效率,差不多。
1.关联表:


2.子查询
  相关解决方案