SQL2008 有列:人、时间、地点,求某人在特定时间内不在特定地点的语句
目前表中情况,共有三列:人、时间、地点
人 时间 地点
张三 2012-06-26 20:36:10 63419-13952
李四 2012-06-26 20:36:10 63419-13900
王五 2012-06-26 20:36:10 63419-13900
赵六 2012-06-26 20:36:10 63419-13988
张三 2012-06-26 20:55:10 63419-13952
李四 2012-06-26 20:57:10 63419-13900
王五 2012-06-26 21:56:10 63419-13952
赵六 2012-06-26 22:00:55 63419-13951
张三 2012-06-26 23:02:10 63419-13911
李四 2012-06-26 23:05:10 63419-13952
王五 2012-06-26 23:10:10 63419-13877
赵六 2012-06-26 23:08:10 63419-13951
条件一:
找出在2012-06-26 20:40:10之前,地点不等于63419-13952或63419-13951的人,求语句。
满足此条件的有三条
李四 2012-06-26 20:36:10 63419-13900
王五 2012-06-26 20:36:10 63419-13900
赵六 2012-06-26 20:36:10 63419-13988
条件二:
找出在2012-06-26 20:50:10之后,2012-06-26 22:30:00之前,
地点等于63419-13952或63419-13951的人,求语句。
满足此条件的有三条
张三 2012-06-26 20:55:10 63419-13952
王五 2012-06-26 21:56:10 63419-13952
赵六 2012-06-26 22:00:55 63419-13951
条件三:
找出在2012-06-26 22:30:00之后,地点不等于63419-13952或63419-13951的人,求语句。
满足此条件的有两条
李四 2012-06-26 23:05:10 63419-13952
赵六 2012-06-26 23:08:10 63419-13951
最后,找出同时符合上述三个条件的人(只要知道结果是赵六就行,不一定要选出赵六的各个时间地点记录)
赵六 2012-06-26 20:36:10 63419-13988
赵六 2012-06-26 22:00:55 63419-13951
赵六 2012-06-26 23:08:10 63419-13951
因水平有限,恳请给出具体的语句,谢谢。
[解决办法]
create table tb(人 varchar(20), 时间 datetime, 地点 varchar(20))
insert into tb values ('张三', '2012-06-26 20:36:10','63419-13952')
insert into tb values ('李四', '2012-06-26 20:36:10','63419-13900')
insert into tb values ('王五', '2012-06-26 20:36:10','63419-13900')
insert into tb values ('赵六', '2012-06-26 20:36:10','63419-13988')
insert into tb values ('张三', '2012-06-26 20:55:10','63419-13952')
insert into tb values ('李四', '2012-06-26 20:57:10','63419-13900')
insert into tb values ('王五', '2012-06-26 21:56:10','63419-13952')
insert into tb values ('赵六', '2012-06-26 22:00:55','63419-13951')
insert into tb values ('张三', '2012-06-26 23:02:10','63419-13911')
insert into tb values ('李四', '2012-06-26 23:05:10','63419-13952')
insert into tb values ('王五', '2012-06-26 23:10:10','63419-13877')
insert into tb values ('赵六', '2012-06-26 23:08:10','63419-13951')
go
--条件一
select * from tb where 时间 < '2012-06-26 20:40:10' and 地点 not in ('63419-13952','63419-13951')
select * from tb where 时间 < '2012-06-26 20:40:10' and 地点 <> '63419-13952' and 地点 <> '63419-13951'
/*
人 时间 地点
-------------------- ------------------------------------------------------ --------------------
李四 2012-06-26 20:36:10.000 63419-13900
王五 2012-06-26 20:36:10.000 63419-13900
赵六 2012-06-26 20:36:10.000 63419-13988
(所影响的行数为 3 行)
人 时间 地点
-------------------- ------------------------------------------------------ --------------------
李四 2012-06-26 20:36:10.000 63419-13900
王五 2012-06-26 20:36:10.000 63419-13900
赵六 2012-06-26 20:36:10.000 63419-13988
(所影响的行数为 3 行)
*/
--条件二
select * from tb where 时间 > '2012-06-26 20:50:10' and 时间 < '2012-06-26 22:30:00' and 地点 in ('63419-13952','63419-13951')
select * from tb where 时间 > '2012-06-26 20:50:10' and 时间 < '2012-06-26 22:30:00' and (地点 ='63419-13952' or 地点 = '63419-13951')
/*
人 时间 地点
-------------------- ------------------------------------------------------ --------------------
张三 2012-06-26 20:55:10.000 63419-13952
王五 2012-06-26 21:56:10.000 63419-13952
赵六 2012-06-26 22:00:55.000 63419-13951
(所影响的行数为 3 行)
人 时间 地点
-------------------- ------------------------------------------------------ --------------------
张三 2012-06-26 20:55:10.000 63419-13952
王五 2012-06-26 21:56:10.000 63419-13952
赵六 2012-06-26 22:00:55.000 63419-13951
(所影响的行数为 3 行)
*/
--条件三 :地点不等于63419-13952或63419-13951的人 应该是:地点等于63419-13952或63419-13951的人
select * from tb where 时间 > '2012-06-26 22:30:00' and 地点 in ('63419-13952','63419-13951')
select * from tb where 时间 > '2012-06-26 22:30:00' and (地点 = '63419-13952' or 地点 = '63419-13951')
/*
人 时间 地点
-------------------- ------------------------------------------------------ --------------------
李四 2012-06-26 23:05:10.000 63419-13952
赵六 2012-06-26 23:08:10.000 63419-13951
(所影响的行数为 2 行)
人 时间 地点
-------------------- ------------------------------------------------------ --------------------
李四 2012-06-26 23:05:10.000 63419-13952
赵六 2012-06-26 23:08:10.000 63419-13951
(所影响的行数为 2 行)
*/
--找出同时符合上述三个条件的人
select t1.人
from
(select * from tb where 时间 < '2012-06-26 20:40:10' and 地点 not in ('63419-13952','63419-13951')) t1,
(select * from tb where 时间 > '2012-06-26 20:50:10' and 时间 < '2012-06-26 22:30:00' and 地点 in ('63419-13952','63419-13951')) t2,
(select * from tb where 时间 > '2012-06-26 22:30:00' and 地点 in ('63419-13952','63419-13951')) t3
where t1.人 = t2.人 and t1.人 = t3.人
select 人 from
(
select distinct 人 from tb where 时间 < '2012-06-26 20:40:10' and 地点 not in ('63419-13952','63419-13951')
union all
select distinct 人 from tb where 时间 > '2012-06-26 20:50:10' and 时间 < '2012-06-26 22:30:00' and 地点 in ('63419-13952','63419-13951')
union all
select distinct 人 from tb where 时间 > '2012-06-26 22:30:00' and 地点 in ('63419-13952','63419-13951')
) t
group by 人 having count(1) = 3
select t1.人 from tb t1 , tb t2 , tb t3
where t1.人 = t2.人 and t1.人 = t3.人 and
(t1.时间 < '2012-06-26 20:40:10' and t1.地点 not in ('63419-13952','63419-13951')) and
(t2.时间 > '2012-06-26 20:50:10' and t2.时间 < '2012-06-26 22:30:00' and t2.地点 in ('63419-13952','63419-13951')) and
(t3.时间 > '2012-06-26 22:30:00' and t3.地点 in ('63419-13952','63419-13951'))
/*
人
--------------------
赵六
(所影响的行数为 1 行)
人
--------------------
赵六
(所影响的行数为 1 行)
人
--------------------
赵六
(所影响的行数为 1 行)
*/
drop table tb