Решение 3.14.5
Консоль
SELECT Country, AVG(bore*bore*bore)/2
FROM (SELECT c.country, bore
FROM Classes C,
Ships S
WHERE S.class = C.Class AND
NOT bore IS NULL
UNION ALL
SELECT country, bore
FROM Classes C,
OutComes O
WHERE O.Ship = C.Class AND
NOT EXISTS (SELECT 1
FROM Ships S
WHERE s.Name = O.Ship
) AND
NOT bore IS NULL
GROUP BY country, bore
) AS Q1
GROUP BY country;
В подзапросе объединяются двухатрибутные отношения {страна, калибр}. Предикат второго запроса:
NOT EXISTS (SELECT 1
FROM Ships S
WHERE s.Name = O.Ship
)
исключает возможность неоднократного учета корабля, если он присутствует в обеих таблицах — Ships и Outcomes, — что как бы оправдывает использование для объединения оператора
UNION ALL. Дубликаты же в таблице Outcomes, которые могут появиться в случае участия корабля в нескольких сражениях, устраняются, по мнению автора решения, группировкой по стране и калибру.
Однако если у страны имеется несколько классов кораблей, имеющих на вооружении орудия одинакового калибра, то возможна ситуация, когда головные корабли этих классов будут присутствовать в таблице Outcomes. В результате вместо нескольких таких кораблей учтен будет только один, что и делает данное решение ошибочным.