Ошибка в решении задачи 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

→ Ссылка
Автор решения: kuznetdim

Добавь DISTINCT в самом первом SELECT введите сюда описание изображения

→ Ссылка
Автор решения: Михаил Акопян
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
)
→ Ссылка