У меня есть таблица подписки на контакты. Контакт может иметь несколько подписок:Сравните даты начала и окончания нескольких строк
CREATE TABLE contact (
id INTEGER NOT NULL,
name TEXT,
PRIMARY KEY (id)
);
CREATE TABLE subscription (
id INTEGER NOT NULL,
contact_id INTEGER NOT NULL REFERENCES contact(id),
start_date DATE,
end_date DATE,
PRIMARY KEY (id)
);
Мне нужно получить все подписки для данного при контакте, что делать не иметь подписку , которая начинается на ту же дату, что и дата окончания другой подписки на такой же связь.
Так что для приведенных данных:
INSERT INTO contact (id, name) VALUES
(1, 'John'),
(2, 'Frank');
INSERT INTO subscription (id, contact_id, start_date, end_date) VALUES
(1, 1, '2012-01-01', '2013-01-01'),
(2, 1, '2013-01-01', '2014-01-01'),
(3, 2, '2012-01-01', '2012-09-01'),
(4, 2, '2013-01-01', '2014-01-01');
Я хочу, чтобы получить подписку с идентификаторами 2, 3, 4, но не 1, потому что контакт «John» имеет подписку с start_date
на том же день (2013-01-01
) в качестве end_date
для подписки с id
из 1.
Что является лучшим способом для достижения этой цели?
Исправлена опечатка, но мне нравится, как вы предоставили правильный тестовый пример. +1 Обратите внимание, однако, что ваш текст противоречит самому себе. Запрос 'для данного контакта' никогда не может возвращать' 2, 3, 4', так как '2' принадлежит отдельному контакту. –