У меня есть запрос «не существует», который работает плохо. Поэтому я, хотя «левый запрос присоединения» будет работать лучше, но это не так. Я запускаю эти запросы в VBA.левый запрос соединения вместо того, чтобы не существовать
вот мой «не существует запрос»
SELECT * FROM MyTable AS t1
WHERE t1.ID_person = 1960081947465
and t1.ID_company <> 68550
and t1.FullTime + 26.3 >= 37.33
and t1.Date <= 20130101
and t1.Code not in (31,28)
and t1.FullTime < 100
and not exists (
select * from MyTable t2 where
t1.ID_person = t2.ID_person
and t2.ID_company <> 68550
and t2.FullTime + 26.3 >= 37.33
and t2.Date <= 20130101
and t2.Code not in (31,28)
and t1.Date< t2.Date
)
А вот как Im пытается добиться того же результата, но с «левой присоединиться к Query»
SELECT * FROM MyTable AS t1
LEFT JOIN
(
select * from MyTable t2 where
and t2.ID_company <> 68550
and t2.FullTime + 26.3 >= 37.33
and t2.Date <= 20130101
and t2.Code not in (31,28)
) subq
ON t1.ID_person = subq.ID_person and t1.Date < subq.Date
WHERE t1.ID_person = 1960081947465
and t1.ID_company <> 68550
and t1.FullTime + 26.3 >= 37.33
and t1.Date <= 20130101
and t1.Code not in (31,28)
and t1.FullTime < 100
and subq.ID_person IS NULL
Почему " левый запрос присоединения "работает хуже? Я думал, что это будет быстрее. У меня есть третья версия того же запроса, но с использованием «не в». Запрос так похож на «не существует запрос», который я не думаю, что мне нужно опубликовать его здесь.
Может ли кто-нибудь предложить лучший/более быстрый «запрос левого соединения» ???
Какие СУБД выходят? 'Left join ... где null' обычно лучше работает в MySQL, а' not exists' обычно работает лучше в некоторых других RDBMS (таких как Oracle и SQLServer). –
Обязательно прочитайте об этом Аарон Бертран (только для Sql-сервера): [Я должен использовать NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT или NOT EXISTS?] (Http://www.sqlperformance.com/2012/12/T-SQL-запросы/лево-анти-полусоединение). –
Это Jet, im, выполняющий запросы от vba/access – user1571823