вступление
У меня есть сложный запрос, который мне нужно написать (для БД Oracle). Я попытался провести аналогию, чтобы избежать использования данных компании, поэтому дайте мне знать, если что-то покажется странным.
Столы
КОШКА
- CAT_ID (ПК)
КОТЕНОК
- КОТЕНОК_ID (ПК)
CAT_KITTEN_PLAY
- PLAY_ID (ПК)
- CAT_ID (FK в таблицу CAT)
- KITTEN_ID (от FK до таблицы KITTEN)
- KITTEN_GENDER (строка — М или Ж)
- PLAY_TIME (дата)
КОТЕНОК_INFO
- KITTEN_ID (от FK до таблицы KITTEN)
- ИМЯ (Строка, например, "Имя")
- ЗНАЧЕНИЕ (строка, например, "Герцогиня")
Описание
Таким образом, таблицы CAT и KITTEN просто содержат идентификаторы и некоторую другую случайную информацию. KITTEN_INFO содержит имена котят (среди прочего). А CAT_KITTEN_PLAY регистрирует все случаи, когда кошка играет с котенком.
Что мне нужно, так это написать запрос, который возвращает всех КОШЕК, чье последнее время игры с КОТЕНКОМ мужского пола было в определенном диапазоне дат. Давайте назовем его с 1 января 2011 года по 31 января 2011 года. Мне также нужно указать дату игры и имя последнего котенка и котенка, с которыми играла кошка.
Уже
Ниже то, что у меня есть до сих пор:
SELECT cat.*, lastMale.PLAY_TIME maleTime, lastFemale.PLAY_TIME femaleTime, maleName.VALUE male, femaleName.VALUE female
FROM CAT cat
LEFT JOIN CAT_KITTEN_PLAY lastMale ON lastMale.CAT_ID = cat.CAT_ID
AND lastMale.GENDER = 'M'
LEFT JOIN CAT_KITTEN_PLAY lastFemale ON lastFemale.CAT_ID = cat.CAT_ID
AND lastFemale.GENDER = 'F'
LEFT JOIN KITTEN_INFO femaleName ON femaleName.KITTEN_ID = lastFemale.KITTEN_ID
AND maleName.NAME = 'Name'
LEFT JOIN KITTEN_INFO maleName ON maleName.KITTEN_ID = lastMale.KITTEN_ID
AND femaleName.NAME = 'Name'
WHERE lastMale.PLAY_TIME BETWEEN '01-JAN-2011 12:00:00 AM'
AND '31-JAN-2011 11:59:59 PM'
Проблемы
Это не учитывает тот факт, что кошка могла играть с котенком женского пола более одного раза. Итак, я бы хотел добавить «AND lastMale.PLAY_TIME = (SELECT MAX(PLAY_TIME) FROM CAT_KITTEN_PLAY, WHERE CAT_ID = cat.ID AND KITTEN_GENDER = 'M')» в первое соединение и аналогичный для второго соединения. Но подзапросы не разрешены для соединений.
Какие-нибудь мысли? Обратите внимание, что кошка, возможно, никогда не играла с котенком женского пола. Но кошка все равно должна быть включена, если они соответствуют критериям (отсюда присоединяется левый).
KITTEN_GENDER
хранится вCAT_KITTEN_PLAY
? Разве это не частьKITTEN_INFO
? - person Andriy M   schedule 28.06.2011