zoukankan      html  css  js  c++  java
  • 用关联子查询比较行与行

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

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

  • 相关阅读:
    actionscript项目中自加载preloader实现
    as3 弹性跑道模型
    快速排序
    快捷键
    frameset和iframe--框架对象及元素标签对象
    Javascript的陷阱
    JS火狐与IE的差别
    JS运动框架
    面向对象与闭包的使用
    闭包
  • 原文地址:https://www.cnblogs.com/Monkey18/p/13470098.html
Copyright © 2011-2022 走看看