Ошибка в решении задачи sql
Решаю следующую задачу на сайте sql-ex.ru: Найдите корабли, сохранившиеся для будущих сражений; т.е. выведенные из строя в одной битве (damaged), они участвовали в другой, произошедшей позже. Есть такие таблицы: Battles (name, date) и Outcomes (ship, battle, result)
Написала такой запрос:
SELECT temp.ship
FROM (SELECT ship
FROM Outcomes JOIN Battles
ON name = battle
WHERE result = 'damaged')AS temp
WHERE EXISTS(
SELECT ship
FROM (Outcomes JOIN Battles
ON name = battle
WHERE date > temp.date AND temp.ship = ship
)
)
Но сайт выдает ошибку:
Incorrect syntax near the keyword 'WHERE'.
С каким WHERE может быть проблема? В чем она заключается?
Ответы (4 шт):
Ошибка возникает из-за скобок и отсутствия атрибута во вложенном запросе, ниже я указал комментарии
SELECT temp.ship
FROM (SELECT ship
FROM Outcomes JOIN Battles
ON name = battle
WHERE result = 'damaged')AS temp
WHERE EXISTS(
SELECT ship
FROM (Outcomes JOIN Battles --Не понятно для чего открывается скобка
ON name = battle
WHERE date > temp.date AND temp.ship = ship -- в вложеном запросе temp нет атрибута temp.date
) --Не понятно для чего закрывается скобка
)
SELECT temp.ship
FROM (
SELECT ship, date
FROM Outcomes JOIN Battles ON name = battle
WHERE result = 'damaged'
)AS temp
WHERE EXISTS(
SELECT ship
FROM Outcomes JOIN Battles ON name = battle
WHERE date > temp.date
AND temp.ship = ship
)
Это исправленный запрос, что написан выше. Он принимается системой на основной базе, но не принимается на проверочной. Я считаю что можно написать запрос проще. Мой вариант:
SELECT o.ship
FROM outcomes o JOIN battles b ON o.battle=b.name
WHERE result NOT IN ('damaged')
AND
EXISTS(
SELECT ship FROM outcomes JOIN battles ON battle=name
WHERE ship = o.ship
AND b.date>date
AND result IN ('damaged')
)
И мой запрос тоже не проходит проверку на проверочной базе. В чём может быть причина, пожалуйста подскажите.
PS ссылка где проверяю: https://www.sql-ex.ru/learn_exercises.php#answer_ref
WITH b AS(
SELECT *
FROM outcomes o JOIN battles b ON o.battle=b.name
)
SELECT DISTINCT b1.ship FROM b b1
WHERE b1.result='damaged' AND EXISTS(
SELECT b2.ship FROM b b2
WHERE b2.date>b1.date AND b1.ship=b2.ship
)
