当前位置: 代码迷 >> Sql Server >> 两表联合查询的语句写法
  详细解决方案

两表联合查询的语句写法

热度:32   发布时间:2016-04-24 10:16:00.0
求一个两表联合查询的语句写法
本帖最后由 iamggggs 于 2014-07-29 20:30:16 编辑

if OBJECT_ID('A')is not null
drop table A
go
if OBJECT_ID('B')is not null
drop table B
go
create table A(
账号 nvarchar(2),
姓名 varchar(8),
任务名称 varchar(8),
任务下达日期 date,
要求完成日期 date
)
go
insert A
select '1','赵','电话回访','2014-07-01','2014-07-05' union all
select '2','钱','电话回访','2014-07-01','2014-07-05' union all
select '3','孙','电话回访','2014-07-01','2014-07-05' 
go

create table B(
账号 nvarchar(2),
姓名 varchar(8),
任务名称 varchar(8),
录入日期 date
)
go
insert B
select '1','赵','电话回访','2014-07-02' union all
select '2','钱','电话回访','2014-07-06' 
go
select * from A
select * from B


--表A:
--账号 姓名 任务名称 任务下达日期 要求完成日期
--1 赵 电话回访 2014-07-01 2014-07-05
--2 钱 电话回访 2014-07-01 2014-07-05
--3 孙 电话回访 2014-07-01 2014-07-05

--表B:
--账号 姓名 任务名称 录入日期
--1 赵 电话回访 2014-07-02
--2 钱 电话回访 2014-07-06


需要得到的查询结果:
账号	姓名	任务名称	任务下达日期	要求完成日期 完成情况
1 赵 电话回访 2014-07-01 2014-07-05   已完成
2 钱 电话回访 2014-07-01 2014-07-05   完成超时
3 孙 电话回访 2014-07-01 2014-07-05  未完成


即:表A是任务表,表B是录入的完成情况表
引用
1、在表B中有记录(账号、姓名、任务名称相同),且表B中的【录入时间】在表A【任务下达日期】和【要求完成日期】之间的,完成情况=已完成
2、在表B中有记录(账号、姓名、任务名称相同),且表B中的【录入时间】超过在表A[要求完成日期】的,完成情况=完成超时
3、未在表B中有录入记录的,完成情况=未完成


因需要在此基础上用前端程序使用条件查询,能否将其写到一个视图中?语法是?

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

select c.帐号,c.姓名,c.任务名称,c.任务下达日期,c.任务完成日期,
case   when c.录入日期 between c.任务下达日期 and c.任务完成日期 then '已完成'
            when c.录入日期 is null then '未完成'
            else  '完成超时' end as '完成情况'
from (
select a.*,B.录入日期 from a left join B on a.帐号=B.账号 and a.任务名称=B.任务名称
)c
------解决方案--------------------
引用:
Quote: 引用:


select c.帐号,c.姓名,c.任务名称,c.任务下达日期,c.任务完成日期,
case   when c.录入日期 between c.任务下达日期 and c.任务完成日期 then '已完成'
            when c.录入日期 is null then '未完成'
            else  '完成超时' end as '完成情况'
from (
select a.*,B.录入日期 from a left join B on a.帐号=B.账号 and a.任务名称=B.任务名称
)c

select c.账号,c.姓名,c.任务名称,c.任务下达日期,c.要求完成日期,
case   when c.录入日期 between c.任务下达日期 and c.要求完成日期 then '已完成'
            when c.录入日期 is null then '未完成'
            else  '完成超时' end as '完成情况'
from (
select a.*,B.录入日期 from a left join B on a.账号=B.账号 and a.任务名称=B.任务名称
)c
 

用left join生成一个临时表再查询的方法可用,结贴时一定给分。
还有没有其他方法?

下面这个方法有点麻烦
select a.*,完成情况=‘未完成’ into c from a 
update c set c.完成情况='已'完成' from b where c.帐号=b.帐号 and c.任务名称=b.任务名称 and b.录入日期 between c.任务下达日期 and c.要求完成日期
update c set c.完成情况='完成超时' from b where c.帐号=b.帐号 and c.任务名称=b.任务名称 and b.录入日期 not between c.任务下达日期 and c.要求完成日期
select  * from c
其实简化成这样:
select a.*,'未完成' as 完成情况 into c from a 
update c set c.完成情况=case when b.录入日期 between c.任务下达日期 and c.任务完成日期 then '已完成' else '完成超时' end  from b where c.帐号=b.账号 and c.任务名称=b.任务名称
select * from c

------解决方案--------------------
select a.*,完成情况='未完成' into c from a 
 update c set c.完成情况='已完成' from b where c.帐号=b.帐号 and c.任务名称=b.任务名称 and b.录入日期 between c.任务下达日期 and c.要求完成日期
 update c set c.完成情况='完成超时' from b where c.帐号=b.帐号 and c.任务名称=b.任务名称 and b.录入日期 not between c.任务下达日期 and c.要求完成日期 and c.完成情况!='已完成'
 select  * from c

试一下上面的语句
  相关解决方案