Характерные ошибки при решении задач на написание запросов на выборку (SELECT)База данных «Корабли»Упражнение 56 стр. 5 |
||||||||||||||||
Решение 3.12.5
Решение 3.12.6
Для анализа двух последних решений — 3.12.5 и 3.12.6 — рассмотрим следующие варианты данных. В таблице Ships (показаны только принципиальные для анализа столбцы):
В таблице Outcomes:
Тогда согласно предикату соединения в решении 3.12.5
Решение задачи 3.12.6 даст нам здесь правильный результат, поскольку первый запрос в объединении (соединение по имени корабля) даст только ship1_class_1, а второй — только class_1. Однако это решение тоже не верно, что будет продемонстрировано на другом варианте данных. В таблице Ships ship1_class_2 class_2 class_2 class_2 В таблице Outcomes: ship1_class_2 sunk class_2 sunk Первый запрос в объединении даст нам оба потопленных корабля класса class_2, а второй — головной корабль этого класса. Поскольку при объединении используется UNION ALL, то головной корабль дважды будет учтен в результирующем наборе, в результате чего мы опять получаем 3 вместо 2. Косметическое исправление UNION ALL на UNION не делает решение верным, так как здесь возникает та же ошибка, что и в решении 3.12.4, когда для любого количества потопленных кораблей класса в результат попадает только 1. Кстати, решение 3.12.5 на этих данных тоже дает значение 3, но по другой причине, описанной выше. |