Как выбрать только те записи, которые не пересекаются и только те, которые пересеклись?

В SQL можно выбрать только те записи, которые не пересекаются, используя операторы сравнения и подзапросы, или с помощью оператора JOIN.

Допустим, у нас есть таблица "Events", содержащая события с начальной и конечной датами:

CREATE TABLE Events (
  id INT PRIMARY KEY,
  event_name VARCHAR(255),
  start_date DATE,
  end_date DATE
);

1. Чтобы выбрать только те записи, которые не пересекаются, можно использовать подзапрос, в котором сравниваются конечная дата события с начальной датой других событий:

SELECT *
FROM Events
WHERE end_date < (SELECT MIN(start_date) FROM Events)

Этот запрос выберет все записи, у которых конечная дата меньше начальной даты самого раннего события.

2. Чтобы выбрать только те записи, которые пересеклись, можно использовать операторы сравнения и соединение таблиц с помощью оператора JOIN. В этом случае, нужно соединить таблицу "Events" с самой собой по условию пересечения дат и выбрать только уникальные пары записей:

SELECT DISTINCT e1.*, e2.*
FROM Events e1
JOIN Events e2 ON (e1.start_date <= e2.end_date AND e1.end_date >= e2.start_date)
WHERE e1.id <> e2.id

Этот запрос вернет все уникальные пары записей, где даты пересекаются. Мы используем условие e1.start_date <= e2.end_date AND e1.end_date >= e2.start_date, чтобы проверить пересечение дат.

В обоих случаях можно добавить дополнительные условия или фильтры, чтобы сузить результаты выборки по другим полям таблицы "Events".