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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2017, 10:44   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Например, вот это вернёт первое сражение по каждому кораблю:
Код:
select o.ship, min(b.date)
from Battles b, Outcomes o
where b.name = o.battle
group by o.ship
а потом его используйте в качестве составного запроса (или как подзапрос).
и там уже выбирайте повреждённые в первом бою корабли.

p.s. а вообще, я могу и ошибаться...

p.p.s. кстати, а Вы в какой СУБД проверяете свои запросы?
я же надеюсь, что Вы их проверяете в работе?

Последний раз редактировалось Serge_Bliznykov; 09.06.2017 в 10:46.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.06.2017, 10:58   #12
Евгений_93
Пользователь
 
Регистрация: 06.06.2017
Сообщений: 41
По умолчанию

как найти корабли, которых нет в outcomes для битв ?
мой вариант
select o.ship, b.date
from Battles b left join Outcomes o
on b.name = o.battle
where o.battle is null вот так?
Евгений_93 вне форума Ответить с цитированием
Старый 09.06.2017, 11:27   #13
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну вот, перечень кораблей поврежденных в первом же их сражении. А вообще тебе рано еще такие запросы, потому что он дальше еще более многоэтажный будет, а судя по вопросам и не пониманию нужно сначала азы освоить
Код:
SELECT O1.ship
  FROM Battles B1,Outcomes O1,
    (SELECT O.ship,MIN(B.[date]) AS [date] FROM Battles B,Outcomes O WHERE B.name=O.battle GROUP BY o.ship) U
  WHERE O1.battle=B1.name AND O1.ship=U.ship AND B1.[date]=U.[date] AND O1.result='damaged'
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.06.2017, 12:58   #14
Евгений_93
Пользователь
 
Регистрация: 06.06.2017
Сообщений: 41
По умолчанию

как найти корабли, которых нет в outcomes для битв ?
Евгений_93 вне форума Ответить с цитированием
Старый 09.06.2017, 13:12   #15
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Евгений_93 Посмотреть сообщение
как найти корабли, которых нет в outcomes для битв ?
поясните, пожалуйста, какие корабли Вы хотите найти?

и ещё, Вы мне не ответили, в чём Вы проверяете работоспособность ваших запросов!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.06.2017, 13:18   #16
Евгений_93
Пользователь
 
Регистрация: 06.06.2017
Сообщений: 41
По умолчанию

корабли которых нет в outcomes для битв, тестируются они на проверочной базе, сайта sql-ex упражнения по sql
Евгений_93 вне форума Ответить с цитированием
Старый 09.06.2017, 13:31   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Евгений_93 Посмотреть сообщение
корабли которых нет в outcomes для битв
корабли, которые никогда ни разу не участвовали в битвах
можно найти таким запросам:

Код:
select * from Ships 
where name not in (select ship from Outcomes)
или написать аналогичный запрос, используя функцию NOT EXISTS

p.s. книжку Мартина Грубера (Грабера) "Понимание SQL" изучали?

Цитата:
Сообщение от Евгений_93 Посмотреть сообщение
тестируются они на проверочной базе, сайта sql-ex упражнения по sql
ок.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.06.2017, 13:35   #18
Евгений_93
Пользователь
 
Регистрация: 06.06.2017
Сообщений: 41
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
корабли, которые никогда ни разу не участвовали в битвах
можно найти таким запросам:

Код:
select * from Ships 
where name not in (select ship from Outcomes)
или написать аналогичный запрос, используя функцию NOT EXISTS

p.s. книжку Мартина Грубера (Грабера) "Понимание SQL" изучали?


ок.
да изучал а что?
Евгений_93 вне форума Ответить с цитированием
Старый 09.06.2017, 13:57   #19
Евгений_93
Пользователь
 
Регистрация: 06.06.2017
Сообщений: 41
По умолчанию

короче теперь я вообще не понимаю эту задачу(((((((((
Евгений_93 вне форума Ответить с цитированием
Старый 09.06.2017, 15:56   #20
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Евгений_93 Посмотреть сообщение
короче теперь я вообще не понимаю эту задачу(((((((((
это задача раздела DML, как я вижу.

Цитата:
Потопить в следующем сражении суда, которые в первой своей битве были повреждены и больше не участвовали ни в каких сражениях. Если следующего сражения для такого судна не существует в базе данных, не вносить его в таблицу Outcomes. Замечание: в базе данных нет двух сражений, которые состоялись бы в один день.(DML)
"потопить" - это в таблице Outcomes в поле result записать 'sunk'


Но проблема с пониманием этой кривосформулированной задачи не только у Вас:
http://www.sql.ru/forum/120900/upraz...tp-sql-ipps-ru

http://sqlinfo.ru/forum/viewtopic.php?pid=24440#p24440

я, например, тоже не понимаю, как может быть, что корабли
1) "и больше не участвовали ни в каких сражениях"
2) и одновременно - "Если следующего сражения для такого судна не существует в базе данных"
ну разумеется, в базе для такого судна следующего сражения не существует, т.к. это судно "и больше не участвовали ни в каких сражениях"!!!

тут на одном форуме предполагают, что:
Цитата:
По сути, Вам нужно найти корабли, которые дважды зацепили, и поставить
второй раз, что их убили.
но я склонен по другому интерпретировать это задание.
вот, админ сайта sql-ex.ru пишет
Цитата:
Корабль участвовал в одном сражении. Если это сражение последнее в хронологическом порядке в БД, то запись не вносить.
т.о. если сражение было но последним, тогда в БД нужно ВНОСИТЬ запись о потоплении корабля!

я понимаю эту задачу так:
A) найти корабли, которые участвовали только в одном сражение и в этом сражении они были повреждены, если это сражение не последняя запись в таблице Outcomes,
B) тогда добавить в таблицу Outcomes (операция Insert) для каждого корабля в ближайшее (следующее по хронологическому порядку) сражение запись, где
Ship - наш корабль из пункта А)
Battle - следующая битва из Outcomes, с датой, следующей за датой, в которой был повреждён Ship из пункта A)
result = 'sunk'

p.s. какой "этажности" получается запрос и как его написать, если честно, я даже не представляю.
Но, по крайней мере, становится ясно, что дано, что требуется сделать и какой результат должен при этом получиться.

Последний раз редактировалось Serge_Bliznykov; 09.06.2017 в 16:07.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SQL: Статистика : годы и сотрудники, решение задачи Geometry SQL, базы данных 2 19.10.2014 09:48
задачи sql kolyan4 Фриланс 8 22.01.2011 23:53
Задачи на SQL (Oracle) soleil@mmc SQL, базы данных 1 18.01.2010 17:55
Помогите, пожалуйста, с написанием задачи в Transact SQL Student'ochka SQL, базы данных 2 24.05.2009 17:21