2009-11-03 4 views
0

У меня есть следующие три таблицы:Оптимизация SQL-запроса с несколькими объединениями

Места проведения, события, экземпляр.

События имеют место проведения (в Местах много событий), а в Событиях много экземпляров.

Например, мероприятие «Терминатор2» - это фильм, который имеет определенное кино в качестве места его проведения и будет иметь много экземпляров этого фильма (даты).

Мне нужно выполнить запрос, который дает мне потерянное Выставочных, которая удовлетворяет следующему:

Место Место х. Место проведения имеет события определенного типа. Thos Events имеют экземпляры в течение определенного периода времени.

Я получил первые два с JOIN на месте и Event (события имеют внешний ключ для места проведения) и предложение WHERE, чтобы убедиться, что события имеют определенный тип. Теперь мне нужно убедиться, что события ТАКЖЕ имеют экземпляры в течение определенного периода времени.

Добавляю ли я еще один JOIN в таблицу Instances (экземпляры имеют внешний ключ для события) и другое предложение WHERE?

Какую производительность следует ожидать от двойного соединения, в два раза, где такой запрос?

Есть ли какие-либо предложения относительно этого лучше?

+0

Является преждевременная оптимизация действительно корень всех зол? http://stackoverflow.com/questions/211414/is-premature-optimization-really-the-root-of-all-evil –

+0

@Rubens: Идея, что нормализация для производительности демонстрирует фундаментальное непонимание того, что нормализация * есть * - референциальная целостность. –

+0

@Rubens да, я хорошо подумал о том, что для производительности я мог бы иметь несколько событий, каждый с другим временем и т. Д. И каким-то образом связывать события так, чтобы, если бы кто-то изменил, я мог бы изменить остальные, но, подумав о последствий было слишком много вопросов. – 2009-11-03 17:34:30

ответ

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' 
+0

Это интересно, я не думал, что есть разница в том, где критерии - я буду смотреть на это. Еще раз спасибо! – 2009-11-03 17:32:59

1

Похоже, вы хотите, СУЩЕСТВУЕТ пункт:

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 
      ) 
+0

Я не знаком с СУЩЕСТВУЮЩИМИ ... прочь сделать какое-то чтение, спасибо! – 2009-11-03 17:35:02

Смежные вопросы