Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Определить страны, которые потеряли в сражениях все свои корабли.

EQE Мастер (1017), на голосовании 4 года назад
Мой запрос возвращает правильные данные на основной базе, но не проходит тест на проверочной базе.
* Неверное число записей (меньше на 1):
Схема БД прикреплена ниже.

SELECT country FROM Classes WHERE country IN (SELECT country FROM Classes LEFT JOIN Outcomes ON Classes.class=Outcomes.ship WHERE Result='sunk') GROUP BY country
Дополнен 4 года назад
В качестве результата выходит страна Germany, но всё равно не проходит проверку.
Голосование за лучший ответ
Jurijus Zaksas Искусственный Интеллект (445813) 4 года назад
Сделай что-нибудь с нормализацией, а то запросы получаются... Неортодоксальные. Примерно такие:

SELECT DISTINCT C.COUNTRY
FROM CLASSES C
INNER JOIN SHIPS S
ON C.CLASS=S.CLASS
WHERE NOT EXISTS
(SELECT NULL FROM OUTCOMES O
WHERE O.RESULT<>'SUNK'
AND O.SHIP=S.NAME)
Ильмир ТазетдиновУченик (100) 4 года назад
Это упражнение на сайте https://www.sql-ex.ru )
Антон Беляев Ученик (214) 3 года назад
SELECT qw1.country FROM
(SELECT country,COUNT(*) as count FROM
(SELECT s.name AS ship,s.class AS class, c.country AS country FROM Ships s
FULL JOIN Classes c ON s.class=c.class
WHERE s.name IS NOT NULL
UNION
SELECT o.ship AS ship,c.class AS class,c.country AS country FROM Outcomes o
FULL JOIN Classes c ON o.ship=c.class
WHERE ship IS NOT NULL AND class IS NOT NULL AND country IS NOT NULL) as t
FULL JOIN (
SELECT * FROM Outcomes
FULL JOIN Battles ON Outcomes.battle=Battles.name
WHERE result='sunk') as t1
ON t.ship=t1.ship
WHERE t.country IS NOT NULL AND t1.ship IS NOT NULL
GROUP BY country) as qw1
JOIN
(SELECT t.country AS country, COUNT(*) AS count FROM
(SELECT s.name AS ship,s.class AS class, c.country AS country FROM Ships s
FULL JOIN Classes c ON s.class=c.class
WHERE s.name IS NOT NULL
UNION
SELECT o.ship AS ship,c.class AS class,c.country AS country FROM Outcomes o
FULL JOIN Classes c ON o.ship=c.class
WHERE ship IS NOT NULL AND class IS NOT NULL AND country IS NOT NULL) as t
GROUP BY t.country) as qw2
ON qw1.country=qw2.country
WHERE qw1.count=qw2.count
НадеждаГруздева Знаток (479) 1 год назад
Весьма изящный код предлагает автор, но не утен тот факт, что в отношение Outcomes могут входить корабли, отсутствующие в отношении Ships.
Антон Терехов Ученик (104) 1 год назад
Сделай вложенный подзапрос для корабликов в справочнике Ships и в списке Outcomes, свяжи со странами в Classes, посчитай отдельно количество корабликов по странам и затопленных корабликов на страну, сравни получившиеся суммы.
with a1 (country,ship) as
(
select country, class
from outcomes oc
join Classes cl on cl.class = oc.ship
union
select country, name
from Ships ss
join classes cl on cl.class = ss.class
)
select t1.country
from(
select a1.country , count(a1.ship) all_ships, null sunk_ships
from a1
group by a1.country
union all
select a1.country , null, count(oc.result)
from outcomes oc
join a1 on a1.ship = oc.ship
where oc.result = 'sunk'
group by a1.country
) t1
group by t1.country
having sum(t1.all_ships) = sum(t1.sunk_ships)
Похожие вопросы