日期:2014-05-16  浏览次数:20501 次

高分请教左连接显示空值的SQL语句
tbMain:主表,主键xh
xm         xh        gzdw
张三   A001    市招商局
李四   A002    市招商局
王五   B001    市教育局
张兵   B002   市教育局
tbKh:考核表,主键xh+khnd
xh            khnd      khdc
A001       2012    优秀
A002       2012    合格
A001       2013    优秀
B001      2012    优秀
B002      2012    合格
B001      2013    优秀
B002      2013    合格

//请注意,A002在2013年度没有考核记录
要查询这个结果:市招商局全体人员2013年度考核结果
xm          xh         gzdw            khnd    khdc
张三   A011    市招商局   2013    合格
李四   A012    市招商局   NULL     NULL 
------解决方案--------------------
http://bbs.csdn.net/topics/390771437
这个帖子不行?就是你要做一个临时表和你的tbmain先做一个交叉连接,形成你每个人要考核年度的表,然后再和考核结果进行连接。否则的很难实现你要的功能
------解决方案--------------------


 ---建临时表
if object_id('Tempdb..#tbMain') is not null drop table #tbMain
if object_id('Tempdb..#tbKh') is not null drop table #tbKh
create table #tbMain(
aid int identity(1,1) not null,
xm nvarchar(100) null,
xh nvarchar(100) null,
gzdw nvarchar(100) null
)
create table #tbKh(
bid  int identity(1,1) not null,
xh nvarchar(100) null,
khnd nvarchar(10) null,
khdc nvarchar(10) null
)
---插入测试数据
Insert Into #tbMain
select '张三','A001','市招商局' union all
select '李四','A002','市招商局' union all
select '王五','B001','市教育局' union all
select '张兵','B002','市教育局'

Insert Into #tbKh
select 'A001','2012','优秀' union all
select 'A002','2012','合格' union all
select 'A001','2013','优秀' union all
select 'B001','2012','优秀' union all
select 'B002','2012','合格' union all
select 'B001','2013','优秀' union all
select 'B002','2013','合格'

----开始查询
---修改一下,汇总#tbKh表年度
;with cte(khnd) as(
select khnd from #tbKh group by khnd

select s.xm,s.xh,s.gzdw,z.khnd,z.khdc
from  #tbMain s cross join cte t        
left join #tbKh z on s.xh=z.xh and t.khnd=z.khnd
where s.gzdw='市招商局' and t.khnd='2013'
 

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

create table tbMain
(xm varchar(10),xh varchar(10),gzdw varchar(10))

insert into&n