Intro
У меня сложный запрос, который мне нужно написать (для БД Oracle).Я попытался провести аналогию, чтобы избежать использования данных компании, поэтому дайте мне знать, если что-то кажется странным.
Таблицы
CAT
KITTEN
CAT_KITTEN_PLAY
- PLAY_ID (PK)
- CAT_ID (таблица FK - CAT)
- KITTEN_ID (таблица FK - KITTEN)
- KITTEN_GENDER (строка - M или F)
- PLAY_TIME (Дата)
KITTEN_INFO
- KITTEN_ID (таблица от FK до KITTEN)
- NAME (строка, например «Имя»)
- VALUE (строка, например «Duchess»)")
Описание
Итак, в основном таблицы CAT и KITTEN содержат только идентификаторы и некоторую другую случайную информацию.KITTEN_INFO содержит имя котят (среди прочего).И CAT_KITTEN_PLAY регистрирует все случаи, когда кошка играет с котенком.
Мне нужно написать запрос, который возвращает всех CAT, чье последнее время воспроизведения с котенком было в определенном диапазоне дат,Давайте назовем это с 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'
Проблемы
Это не учитывает тот факт, что кошка могла играть с котенком / самкой более одного раза.Итак, я хотел бы добавить «И lastMale.PLAY_TIME = (ВЫБЕРИТЕ МАКС. (PLAY_TIME) FROM CAT_KITTEN_PLAY WHERE CAT_ID = cat.ID AND KITTEN_GENDER = 'M')" в первом соединении и аналогично второму соединению.Но подзапросы не допускаются в соединениях.
Есть мысли?Обратите внимание, что кошка, возможно, никогда не играла с котенком.Но кошка все равно должна быть включена, если они отвечают критериям (следовательно, левые присоединяются).