Запутался в джойнах?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.08.23 16:39
Оценка:
Тренируюсь писать запросы, нашел вот такую задачу, #32 на sqlpad.io

  Условие
film
col_name | col_type
----------------------+--------------------------
film_id | integer
title | text
description | text
release_year | integer
language_id | smallint
original_language_id | smallint
rental_duration | smallint
rental_rate | numeric
length | smallint
replacement_cost | numeric
rating | text

inventory
col_name | col_type
--------------+--------------------------
inventory_id | integer
film_id | smallint
store_id | smallint

rental
col_name | col_type
--------------+--------------------------
rental_id | integer
rental_ts | timestamp with time zone
inventory_id | integer
customer_id | smallint
return_ts | timestamp with time zone
staff_id | smallint


Мое решение
WITH rental_inventory AS (
  SELECT 
      R.inventory_id,
      I.film_id
  FROM 
      rental R INNER JOIN inventory I ON R.inventory_id = I.inventory_id 
  WHERE
      DATE(rental_ts) >= '2020-02-01' AND DATE(rental_ts) <= '2020-02-29'
)
SELECT 
    COUNT(*)
FROM 
    film F LEFT JOIN rental_inventory RI ON F.film_id = RI.inventory_id
WHERE 
    RI.inventory_id IS null


Результат не сходится с ответом. Где тут может быть ошибка?

Вот второй вариант, здесь всё в порядке
WITH rental_feb as (
  SELECT
      inventory_id,
        rental_ts
  FROM 
    rental
  WHERE
      DATE(rental_ts) >= '2020-02-01' AND   DATE(rental_ts) <= '2020-02-29'
), films_rented as (
   SELECT 
      DISTINCT film_id 
   FROM 
      rental_feb RF INNER JOIN inventory I ON RF.inventory_id = I.inventory_id
)
SELECT 
    COUNT(*) 
FROM 
    film 
WHERE 
    film_id NOT IN (SELECT film_id FROM films_rented)
Отредактировано 08.08.2023 17:02 Pauel . Предыдущая версия .
Re: Запутался в джойнах?
От: pilgrim_ Россия  
Дата: 08.08.23 17:21
Оценка: 15 (1)
Здравствуйте, Pauel, Вы писали:

P>Тренируюсь писать запросы, нашел вот такую задачу, #32 на sqlpad.io


P>Мое решение

P>
P>WITH rental_inventory AS (
P>  SELECT 
P>      R.inventory_id,
P>      I.film_id
P>  FROM 
P>      rental R INNER JOIN inventory I ON R.inventory_id = I.inventory_id 
P>  WHERE
P>      DATE(rental_ts) >= '2020-02-01' AND DATE(rental_ts) <= '2020-02-29'
P>)
P>SELECT 
P>    COUNT(*)
P>FROM 
P>    film F LEFT JOIN rental_inventory RI ON F.film_id = RI.inventory_id
P>WHERE 
P>    RI.inventory_id IS null
P>


P>Результат не сходится с ответом. Где тут может быть ошибка?



FROM 
    film F LEFT JOIN rental_inventory RI ON F.film_id = RI.inventory_id
WHERE 
    RI.inventory_id IS null


Не вникая, но в выделенном явно ожидается film_id.
Re[2]: Запутался в джойнах?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 08.08.23 17:39
Оценка: :)
Здравствуйте, pilgrim_, Вы писали:

P>>Результат не сходится с ответом. Где тут может быть ошибка?


_>
_>FROM 
_>    film F LEFT JOIN rental_inventory RI ON F.film_id = RI.inventory_id
_>WHERE 
_>    RI.inventory_id IS null
_>


_>Не вникая, но в выделенном явно ожидается film_id.


Спасибо! Шота я вижу, надо побольше отдыхать
Re: Запутался в джойнах?
От: paucity  
Дата: 13.08.23 19:45
Оценка:
Здравствуйте, Pauel, Вы писали:

P>... на sqlpad.io


Минимум $80 в месяц. Стоит того?
Re[2]: Запутался в джойнах?
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 14.08.23 08:10
Оценка: 2 (1)
Здравствуйте, paucity, Вы писали:

P>>... на sqlpad.io


P>Минимум $80 в месяц. Стоит того?


Теоретически, всё можно самому — поднять postgress, накидать базу, придумать себе задач. Проблема в том, что БД у меня всегда были второстепенной областью, а потому я совершенно не представляю, какие типовые задачи, как вообще может выглядеть схема базы итд.
Утрирую, конечно, но это так.
Соответсвенно этот ресурс примерно как интерактивная книга по SQL. Книги, что я покупаю, я большей частью не читаю постоянно. Обычно это от нескольких дней до месяца.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.