Задавайте вопросы, мы ответим
Вы не зашли.
Итак, я прикрепил новый дамп базы, в которой есть новый корабль Japanez. Исходя из предыдущий запросов мы имеем: два корабля, который нет в Ships, то есть Bismark и Japanez; с помощью запроса
SELECT ROUND( AVG( launched ) )
FROM Ships
JOIN Classes
USING ( class )
WHERE Classes.country = 'Japan'
можно определить средний год. Самая проблема теперь заключается в том, как определить класс у Japanez и как реализовать функцию, которые бы отбросила Bismark из списка добавляемых из-за того, что его средний год определить нельзя. Жду Вашего решения. ))
Отредактированно pkhell (04.05.2011 18:06:43)
Неактивен
Тогда по условию NULL
Ну или действительно добавить fake-кораблей, чтобы убедиться, что запрос
работает.
Неактивен
Так корабль я добавил, но не знаю как написать правильный, рабочий запрос на определение класса, а сроки уже поджимают. Надеюсь на Вашу помощь.
Неактивен
К тому же надо создать условие, чтобы Bismark не добавлялся. Тут тоже сложновато понять.
Неактивен
Ну что-то Вы совсем про меня позабыли, а я без Вашей помощи дальше двинуться не могу...
Неактивен
После долгих мучений у меня получилось следующее:
Неактивен
Ух, давно не заходил
По третьему заданию подсказка есть в http://sqlinfo.ru/forum/viewtopic.php?pid=24440#p24440
По сути, Вам нужно найти корабли, которые дважды зацепили, и поставить
второй раз, что их убили.
Неактивен
Я уже скучать начал. ))) Подсказки не хватает, не понимаю я эту задачу. Предыдущую, кстати, смог доделать и сдать. ))
Неактивен
Вот, замечательно, что сделали самостоятельно
Для начала надо разобраться с заданием — понять, что за корабли нас интересуют.
Мне кажется, что это корабли, которые побывали как минимум в двух битвах, и
в обеих битвах оказались ранеными. Это будет некоторый подзапрос. Из этого
подзапроса надо выбрать строки битв, которые были самыми поздними для одного
корабля (например, сгруппировать и вытащить максимальную дату сражения).
И вот для этих строк нужно поставить «убит» вместо «ранен»
Неактивен
Хм. Тогда мне очень интересно, где находится информация о второй битве? Корабли и их битвы указаны лишь в таблице Outcomes.
Неактивен
Именно там и хранится, что Вас смущает?
Неактивен
Не понимаю. Исходя из этой таблицы я получаю лишь одну битву для одного корабля. Или я совсем глуп??? Если честно, я тут вообще ничего не понимаю. Не могу алгоритм составить. ((
Неактивен
Ну, не совсем (один корабль таки стоит затопить ):
[silentia] root test > SELECT ship, MAX(date), COUNT(*) FROM Outcomes o JOIN Battles b ON b.name = o.battle GROUP BY 1; +-----------------+---------------------+----------+ | ship | MAX(date) | COUNT(*) | +-----------------+---------------------+----------+ | Bismarck | 1941-05-25 00:00:00 | 1 | | California | 1944-10-25 00:00:00 | 2 | | Duke of York | 1943-12-26 00:00:00 | 1 | | Fuso | 1944-10-25 00:00:00 | 1 | | Hood | 1941-05-25 00:00:00 | 1 | | Japanez | 1941-05-25 00:00:00 | 1 | | King George V | 1941-05-25 00:00:00 | 1 | | Kirishima | 1942-11-15 00:00:00 | 1 | | Prince of Wales | 1941-05-25 00:00:00 | 1 | | Rodney | 1941-05-25 00:00:00 | 1 | | Schamhorst | 1943-12-26 00:00:00 | 1 | | South Dakota | 1942-11-15 00:00:00 | 1 | | Tennessee | 1944-10-25 00:00:00 | 1 | | Washington1 | 1942-11-15 00:00:00 | 1 | | West Virginia | 1944-10-25 00:00:00 | 1 | | Yamashiro | 1944-10-25 00:00:00 | 1 | +-----------------+---------------------+----------+ 16 rows in set (0.00 sec)
Неактивен
Хм. Задание звучит так:
Потопить в следующем сражении суда, которые в первой своей битве были повреждены и больше не участвовали ни в каких сражениях. Если следующего сражения для такого судна не существует в базе данных, не вносить его в таблицу Outcomes. Замечание: в базе данных нет двух сражений, которые состоялись бы в один день.
Из вышесказанно следует, что корабль должен быть поврежден в первом сражении и больше не участвовать в боях. Исходя из Outcomes, имеется всего один корабль, который был в 2 сражениях, но в первом он не был поврежден. Мы имеем корабли, которые были повреждены, но мы не может узнать, участвовали ли они в следующих сражениях или нет. Мне кажется, что из подобной базы этого не узнать и имеется необходимость добавить новый. Причем надо потопить, то есть UPDATE, но зачем еще надо и добавлять корабли??? Не понимаю. Жду Вашего мнения.
Неактивен
Эм. Значит, я неправильно прочитал задание. Мне казалось, топить надо как раз те,
которые участвовали второй раз.
Ок, тогда поправьте меня, если я ошибаюсь в следующих утверждениях:
1. Корабль, который был поврежден в первой своей битве, и больше нигде не участ-
вующий должен иметь только одну строку в таблице сражений.
2. Мы не должны вносить в таблицу сражений новые сражения.
3. Мы должны внести в таблицу сражений новое сражение, в котором должны потопить
корабль.
Так как пункты 2 и 3 конфликтуют между собой, сделаем вывод, что условие несамосог-
ласовано, а потому мы должны его немного изменить, чтобы не приходить с пустыми
руками. Например, так. Будем считать, что корабль, который был ранен в одном сраже-
нии, считается не участвующим в последующих сражениях в том случае, если в после-
дующих сражениях написано, что он «живой».
Тогда нас интересуют корабли, у которых есть по крайней мере две записи в таблице
сражений, первая из которых — «ранен», а вторая, — «жив». Для всех таких кораблей
нужно заменить «жив» на «убит».
Такое решение устроит?
Неактивен
Вот тебе раз! )) Прям сочинение получилось. Логика, я думаю, у Вас правильная, вот только суть решения я все равно не могу уловить. У нас нет второго сражения, следовательно, нет нужных кораблей. Я прав? Мне кажется, что следует добавить корабль. ))
Отредактированно pkhell (19.05.2011 12:05:14)
Неактивен
У нас есть один корабль, который удовлетворяет всем рассуждениям: California.
Он как раз был один раз подбит, а в следующем сражении выжил. Предлагаю
его потопить и забыть про эту задачку
Неактивен
Уважаемый paulus. Благодаря Вашим наставлениям у меня получился запрос следующего вида:
Неактивен
Мне нравится
Неактивен