使用多个联接优化SQL查询

时间:2009-11-03 16:30:20

标签: sql query-optimization

我有以下三个表:

场地,活动,实例。

活动有场地(场地有很多活动),活动有很多实例。

例如,事件“终结者2”是一部以某个电影院为场地的电影,并且会有很多电影的实例(日期时间)。

我需要运行一个查询,这会让我失去满足以下条件的场地:

场地位置是x。 场地有某种类型的事件。 Thos Events在一段时间内有实例。

我在场地和事件(事件有场地的外键)和一个WHERE子句中实现了前两个,以确保事件属于某种类型。现在我需要确保事件也在特定时间段内有实例。

我是否在Instances表上添加了另一个JOIN(Instances有一个事件的外键)和另一个WHERE子句?

我应该从双联接中获得什么样的性能,在这样的查询中加倍?

对于这样做有更好的方法吗?

2 个答案:

答案 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
           )