Каков наиболее эффективный способ выбора данных из реляционной базы данных? - PullRequest
0 голосов
/ 28 марта 2020

Я только начал работать с базами данных, и у меня есть образец данных из PostgreSQL учебник https://www.postgresqltutorial.com/postgresql-sample-database/

Какая диаграмма выглядит следующим образом: enter image description here

Я хочу найти все категории фильмов, взятые напрокат, например, в Канаде. Есть ли способ сделать это без использования SELECT в операторе SELECT .., например:

SELECT * FROM category WHERE category_id IN (
    SELECT category_id FROM film_category WHERE film_id IN (
        SELECT film_id FROM film WHERE film_id IN (
            SELECT film_id FROM inventory WHERE inventory_id IN (
                SELECT inventory_id FROM rental WHERE staff_id IN (
                    SELECT staff_id FROM staff WHERE store_id IN (
                        SELECT store_id FROM store WHERE address_id IN (
                            SELECT address_id FROM address WHERE city_id IN (
                                SELECT city_id FROM city WHERE country_id IN (
                                    SELECT country_id FROM country WHERE country IN ('Canada')
                                )
                            )
                        )
                    )
                )
            )
        )
    )
)

Я уверен, что должно быть что-то, чего мне не хватает.

1 Ответ

2 голосов
/ 28 марта 2020

Надлежащим способом является использование объединений вместо всех этих вложенных подзапросов:

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, поэтому вы не получите дубликатов в результатах, поскольку все эти объединения возвращают много строк для каждой категории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...