用关联子查询比较行与行
有下面一张表记录了酒店或者旅馆的预约情况,查询出存在重叠的住宿区间
创建测试数据(MSSQL)
CREATE TABLE house ( [name] varchar(50), [startdate] date, [enddate] date )
INSERT INTO house
VALUES
( '赵大', N'2020-10-26T00:00:00', N'2020-10-27T00:00:00' ),
( '钱二', N'2020-10-28T00:00:00', N'2020-10-31T00:00:00' ),
( '孙三', N'2020-10-31T00:00:00', N'2020-11-01T00:00:00' ),
( '李四', N'2020-11-04T00:00:00', N'2020-11-04T00:00:00' ),
( '周五', N'2020-11-03T00:00:00', N'2020-11-05T00:00:00' ),
( '吴六', N'2020-11-06T00:00:00', N'2020-11-06T00:00:00' )
1 SELECT * 2 FROM house a 3 WHERE EXISTS 4 ( 5 SELECT * 6 FROM dbo.house b 7 WHERE a.name <> b.name 8 AND 9 ( 10 ( 11 a.startdate 12 BETWEEN b.startdate AND b.enddate 13 OR a.enddate 14 BETWEEN b.startdate AND b.enddate 15 ) 16 OR 17 ( 18 b.startdate 19 BETWEEN a.startdate AND a.enddate 20 AND b.enddate 21 BETWEEN a.startdate AND a.enddate 22 ) 23 ) 24 );
自己和自己在住宿期间上肯定是重叠的,所以如果没有 a.name<>b.name 这个条件,所有人都会出现在结果列表里。
如果想求“与任何住宿期间都不重叠的日期”,我们只需要把 EXISTS
谓词改写成 NOT EXISTS
谓词就可以了。