求助:经典SQL面试验题,在线等答案 急!!!
/*
题目1:
有cc、dd两张表A、B是组合主键
cc表
A B C
10 11 33
13 15 NULL
dd表
A B D
10 11 34
20 30 NULL
怎么才能查出如下结果:
A B C D
10 11 33 34
13 15 NULL NULL
20 30 NULL NULL
要求:写出T-SQL语句,不能通过存储过程等!
select a,b,c,d
from cc left join dd
on cc.a=dd.a
用上面的语句显示错误,不能确定a和b 是哪个表的
如果变成
select cc.a,cc.b,c,d
from cc left join dd
on cc.a=dd.a
只能显示cc表中的两条
请高手帮忙解决
------解决方案--------------------create table #cc
(
a char(2)
,b char(2)
,c char(2)
)
create table #dd
(
a char(2)
,b char(2)
,d char(2)
)
insert #cc
select '10','11','33'
union all
select '13','15',null
insert #dd
select '10','11','34'
union all
select '20','30',null
select * From #dd
select * From #cc
select isnull(CC.A,DD.A),IsNull(CC.B,DD.B),CC.C,DD.D
from #CC cc
full outer join #DD dd on CC.A=DD.A and CC.B=DD.B
drop table #cc
drop table #dd
------解决方案----------------------应该这样处理:
create table #CC(A int, B int, C int)
insert into #CC select 10, 11, 33
insert into #CC select 13, 15, NULL
create table #DD(A int, B int, D int)
insert into #DD select 10, 11, 34
insert into #DD select 20, 30, NULL
select * from #CC
select * from #DD
select t.A,t.B,t1.C,t2.D
from
(
select A,B from #CC
union
select A,B from #DD
) as t
left join #CC as t1 on t.A=t1.A and t.B=t1.B
left join #DD as t2 on t.A=t2.A and t.B=t2.B
drop table #CC,#DD
------解决方案--------------------select X.a, X.b,X.c,Y.d
from X left join Y
on X.a=Y.a and X.b=Y.b
union
select Y.a, Y.b,X.c,Y.d
from Y left join X
on X.a=Y.a and X.b=Y.b
------解决方案----------------------full join就可以了
create table #CC(A int, B int, C int)
insert into #CC select 10, 11, 33
insert into #CC select 13, 15, NULL
create table #DD(A int, B int, D int)
insert into #DD select 10, 11, 34
insert into #DD select 20, 30, NULL
select isnull(#cc.a,#dd.a) as A ,isnull(#cc.b,#dd.b) as B,#cc.c,#dd.d
from #cc
full join #dd
on #cc.a=#dd.a and #cc.b=#dd.b
/*
A B c d
----------- ----------- ----------- -----------
10 11 33 34
13 15 NULL NULL
20 30 NULL NULL
*/
drop table #cc,#dd
------解决方案--------------------select s.a,s.b,s.c,t.d from A s left outer join B t
on s.a=t.a and s.b=t.b
union
select tt.a,tt.b,ss.c,tt.d from A ss right outer join B tt
on ss.a=tt.a and ss.b=tt.b
这个可以 用2个外连接就可以得到了.我测试通过了.
------解决方案--------------------select #tmpCC.A,#tmpCC.B,#tmpCC.C,#tmpDD.D
from #tmpCC left join #tmpDD
on #tmpCC.A=#tmpDD.A and #tmpCC.B=#tmpDD.B
union
select #tmpDD.A,#tmpDD.B,#tmpCC.C,#tmpDD.D
from #tmpDD left join #tmpCC
on #tmpDD.A=#tmpCC.A and #tmpDD.B=#tmpCC.B
2个外连接测试通过
------解决方案--------------------