• 用关联子查询比较行与行


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

    创建测试数据(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 谓词就可以了。

  • 相关阅读:
    qt中使用dll库的方法
    41. wait notify 方法
    40.方式二的练习
    39.线程的实现方式二
    38. 死锁
    37. 解决线程问题方式二(同步函数)
    36. 解决线程问题方式一(同步代码块synchronized)
    35.线程问题
    34. Thread类的常用方法
    33. 自定义线程
  • 原文地址:https://www.cnblogs.com/Monkey18/p/13470098.html
Copyright © 2020-2023  润新知