我有以下三个表:
场地,活动,实例。
活动有场地(场地有很多活动),活动有很多实例。
例如,事件“终结者2”是一部以某个电影院为场地的电影,并且会有很多电影的实例(日期时间)。
我需要运行一个查询,这会让我失去满足以下条件的场地:
场地位置是x。 场地有某种类型的事件。 Thos Events在一段时间内有实例。
我在场地和事件(事件有场地的外键)和一个WHERE子句中实现了前两个,以确保事件属于某种类型。现在我需要确保事件也在特定时间段内有实例。
我是否在Instances表上添加了另一个JOIN(Instances有一个事件的外键)和另一个WHERE子句?
我应该从双联接中获得什么样的性能,在这样的查询中加倍?
对于这样做有更好的方法吗?
答案 0 :(得分:1)
SELECT v.Venue, e.Event, i.Instance
FROM Venue v
INNER JOIN Event e
ON v.EventID = e.EventID
INNER JOIN Instance i
ON e.EventID = i.EventID
WHERE v.Venue = 'X'
AND e.Event = 'Terminator2'
AND i.InstanceDateTime BETWEEN '11/01/2009' AND '11/01/2009 23:59:00'
或者,在某些情况下,您可以在条件中包含可能表现更好的条件。
SELECT v.Venue, e.Event, i.Instance
FROM Venue v
INNER JOIN Event e
ON v.EventID = e.EventID
AND e.Event = 'Terminator2'
INNER JOIN Instance i
ON e.EventID = i.EventID
AND i.InstanceDateTime BETWEEN '11/01/2009' AND '11/01/2009 23:59:00'
WHERE v.Venue = 'X'
答案 1 :(得分:1)
听起来你想要一个EXISTS条款:
select * from venues v
where v.venue_type = 'X'
and exists (select null
from events e
join instances i on i.event_id = e.event_id
where e.venue_id = v.venue_id
and e.event_type = 'Y'
and i.instance_date between :date1 and :date2
)