在两个表上联接两个表

时间:2020-02-12 05:05:55

标签: sql presto

如果我有两个没有直接关系的表,但必须通过第三个表连接,那么最好的方法是什么?

artist
======
 - id
 - name

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

artist_event
======
 - artist_id 
 - event_id 

下面的查询是否可以查找所有在12月有活动的艺术家?

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 :(得分:1)

通常,在谈论一个月时,您希望包括一年。所以我建议:

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' );

这消除了外部查询中的重复消除。