Естественное соединение SQL

#postgresql

#postgresql

Вопрос:

Хорошо. Итак, вопрос, который мне задал учитель, был таким:

  1. (5 баллов) Создайте SQL-запрос к базе данных dvdrental, который использует естественное соединение двух или более таблиц и дополнительное условие where. (Например, найдите названия фильмов, взятых напрокат конкретным клиентом.) Обратите внимание на подсказки на странице новостей курса, если ваш запрос ничего не возвращает.

Вот макет базы данных, с которой я работаю: http://www.postgresqltutorial.com/wp-content/uploads/2013/05/PostgreSQL-Sample-Database.png

Подсказка для нас заключалась в следующем:

Подсказка PostgreSQL: если естественное соединение не дает никаких результатов в dvdrental DB, это потому, что во многих таблицах есть поле last update: timestamp, и, таким образом, естественное соединение пытается присоединиться к этому полю, а также к предполагаемому полю.

например

 select * 
from film natural join inventory;
  

из-за этого не работает — выдает пустую таблицу (без результатов).
Вместо этого используйте

 select * 
from film, inventory
where film.film_id = inventory.film_id;
  

Это то, что я сделал:

 select * 
from film, customer
where film.film_id = customer.customer_id;
  

Проблема в том, что я не могу получить конкретного клиента.
Я пытался это сделать customer_id = 2; , но он возвращает ошибку.
Действительно нужна помощь!

Комментарии:

1. Можете ли вы поделиться своим полным запросом и полученной ошибкой?

2. Это отличный пример того, почему natural join следует избегать, как чумы.

3. Условие соединения film.film_id = customer.customer_id совершенно неверно. A film_id не ссылается на a customer_id . Чтобы получить фильмы, которые арендовал клиент, вам необходимо объединить film, inventory, rental и customer, например from film f join inventory i ON f.film_id = i.film_id join rental r ON i.inventory_id = r.inventory_id join customer c ON c.customer_id = r.customer_id

Ответ №1:

Ну, кажется, что вы хотели бы объединить две таблицы, которые не имеют прямого отношения друг к другу, вот ваша проблема:

 where film.film_id = customer.customer_id
  

Чтобы найти, какие фильмы арендуются каким клиентом, вам нужно будет объединить таблицу customer с rental, затем с inventory и, наконец, с film.

В описании задачи говорится

Создайте SQL-запрос к базе данных dvdrental, который использует естественное соединение двух или более таблиц и дополнительное условие where.Цитата