Надлежащим способом является использование объединений вместо всех этих вложенных подзапросов:
select distinct c.category_id, c.name
from category c
inner join film_category fc on fc.category_id = c.category_id
inner join inventory i on i.film_id = fc.film_id
inner join rental r on r.inventory_id = i.inventory_id
inner join staff s on s.staff_id = r.staff_id
inner join store sr on sr.store_id = s.store_id
inner join address a on a.address_id = sr.address_id
inner join city ct on ct.city_id = a.city_id
inner join country cr on cr.country_id = ct.country_id
where cr.country = 'Canada'
Для ваших требований вы должны объединить 9 таблиц (на 1 меньше, чем код, потому что таблица film
на самом деле не требуется, поскольку столбец film_id
может напрямую связывать таблицы film_category
и inventory
). Обратите внимание на псевдонимы для каждой таблицы, которая сокращает код и делает его более читабельным, и предложения ON
, которые используются для связи каждой пары таблиц. Также используется ключевое слово DISTINCT
, поэтому вы не получите дубликатов в результатах, поскольку все эти объединения возвращают много строк для каждой категории.