Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2009, 22:18   #1
Maxo
Новичок
Джуниор
 
Регистрация: 02.12.2009
Сообщений: 1
По умолчанию Подскажите логику

Всем select! Помогите плиз с запросом!!!!!
Имеются следующие отношения:
Classes (class, type, country, numGuns, bore, displacement)
Ships (name, class, launched)
Battles (name, date)
Outcomes (ship, battle, result)
Корабли в «классах» построены по одному и тому же проекту, и классу присваивается либо имя первого корабля, построенного по данному проекту, либо названию класса дается имя проекта, которое не совпадает ни с одним из кораблей. Корабль, давший название классу, называется головным.
Отношение Classes содержит имя класса, тип (bb для боевого (линейного) корабля или bc для боевого крейсера), страну, в которой построен корабль, число главных орудий, калибр орудий (диаметр ствола орудия в дюймах) и водоизмещение ( вес в тоннах). В отношении Ships записаны название корабля, имя его класса и год спуска на воду. В отношение Battles включены название и дата битвы, в которой участвовали корабли, а в отношении Outcomes – результат участия данного корабля в битве (потоплен-sunk, поврежден - damaged или невредим - OK). Замечание. В отношение Outcomes могут входить корабли, отсутствующие в отношении Ships.

Задача 5
Для каждого корабля из таблицы Ships указать название ближайшего по времени сражения из таблицы Battles,
в котором корабль мог бы участвовать после спуска на воду. Если год спуска на воду неизвестен, взять последнее по времени сражение.
Если нет сражения, произошедшего после спуска на воду корабля, вывести NULL вместо названия сражения.
Замечание. Считать, что корабль может участвовать в сражении, которое произошло в год спуска на воду корабля.
Вывод: имя корабля, год спуска на воду, название сражения

Мой запрос:

SELECT DISTINCT minyear.name, minyear.launched, battles.name FROM (select distinct ships.name, ships.launched, min(distinct battles.date) as y from ships full join battles on ships.launched<=year(battles.date)
group by ships.name, ships.launched) as minyear left JOIN battles ON minyear.y=battles.date

Интуитивно понимаю, что из-за внешних соединений косяк, но как исправить не могу понять! Блин уже неделю решаю....1 балл у задачи называется...хотя решил некоторые 3 бальные за пару часов...

Подскажите или решение или хотябы порядок действий, логику...Буду очень признателен!!!!
Maxo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как осуществить такую логику mortira Общие вопросы Delphi 27 29.06.2009 18:15
Подскажите Ser Паскаль, Turbo Pascal, PascalABC.NET 1 15.03.2008 18:32
Тест на логику xTANATOSx Свободное общение 5 21.10.2007 16:39