用关联子查询比较行与行

有下面一张表记录了酒店或者旅馆的预约情况,查询出存在重叠的住宿区间

创建测试数据(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 );
View Code

自己和自己在住宿期间上肯定是重叠的,所以如果没有 a.name<>b.name 这个条件,所有人都会出现在结果列表里。

如果想求“与任何住宿期间都不重叠的日期”,我们只需要把 EXISTS 谓词改写成 NOT EXISTS 谓词就可以了。

 

posted @ 2020-08-10 15:39  飞扬92  阅读(101)  评论(0编辑  收藏  举报