LoginSignup
0
0

More than 3 years have passed since last update.

相関サブクエリで宿泊期間の重複を抽出する

Last updated at Posted at 2020-11-23

以下のデータがある。

select * from reservations;

+----------+------------+------------+
| reserver | start_date | end_date   |
+----------+------------+------------+
| 内田     | 2006-11-03 | 2006-11-05 |
|        | 2006-10-31 | 2006-11-01 |
| 山本     | 2006-11-03 | 2006-11-04 |
| 木村     | 2006-10-26 | 2006-10-27 |
| 水谷     | 2006-11-06 | 2006-11-06 |
| 荒木     | 2006-10-28 | 2006-10-31 |
+----------+------------+------------+

宿泊期間が重複しているレコードを抽出する。

select
*
from
reservations r1
where
exists (
    select
    'X'
    from
    reservations r2
    where
    r1.reserver <> r2.reserver
    and (r1.start_date between r2.start_date and r2.end_date -- 開始日が他の期間内にある
        or r1.end_date between r2.start_date and r2.end_date -- 終了日が他の期間内にある
    )
    and (r2.start_date between r1.start_date and r1.end_date -- 開始日が他の期間内にある
        or r2.end_date between r1.start_date and r1.end_date -- 終了日が他の期間内にある
    )
)

+----------+------------+------------+
| reserver | start_date | end_date   |
+----------+------------+------------+
| 内田     | 2006-11-03 | 2006-11-05 |
|        | 2006-10-31 | 2006-11-01 |
| 山本     | 2006-11-03 | 2006-11-04 |
| 荒木     | 2006-10-28 | 2006-10-31 |
+----------+------------+------------+

こちらを参考にさせていただきました。
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0