Соединение двух столов на третьем столе - PullRequest
0 голосов
/ 12 февраля 2020

Если у меня есть две таблицы, которые не имеют прямой связи, но должны быть объединены через третью таблицу, какой метод будет наилучшим?

artist
======
 - id
 - name

event
======
 - id
 - title
 - start_time 

artist_event
======
 - artist_id 
 - event_id 

Будет ли работать запрос ниже, чтобы найти всех артистов с событием в декабре?

select distinct a.name
from artist a
join artist_event ae
on a.id = ae.artist_id
join event e 
on e.id = ae.event_id
where date_trunc('month', e.start_time) = 'December'

Спасибо

1 Ответ

0 голосов
/ 12 февраля 2020

Обычно вы хотите указать год, когда говорите о месяце. Поэтому я бы порекомендовал:

select distinct a.name
from artist a join
     artist_event ae
     on a.id = ae.artist_id join
     event e 
     on e.id = ae.event_id
where e.start_time >= '2019-12-01' and
      e.start_time < '2020-01-01';

Ваша версия не будет работать, потому что 'December' - строка (название месяца). date_trunc() возвращает дату (которая не является строкой).

Тем не менее, я рекомендую exists вместо:

select a.name
from artist a
where exists (select 1
              from artist_event ae join
                   event e 
                   on e.id = ae.event_id
              where a.id = ae.artist_id 

и e.start_time> = '2019-12 -01 'и e.start_time <' 2020-01-01 '); </p>

Это устраняет дублирование устранения во внешнем запросе.

...