2013-04-16 2 views
0

У меня есть запрос «не существует», который работает плохо. Поэтому я, хотя «левый запрос присоединения» будет работать лучше, но это не так. Я запускаю эти запросы в 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 

Почему " левый запрос присоединения "работает хуже? Я думал, что это будет быстрее. У меня есть третья версия того же запроса, но с использованием «не в». Запрос так похож на «не существует запрос», который я не думаю, что мне нужно опубликовать его здесь.

Может ли кто-нибудь предложить лучший/более быстрый «запрос левого соединения» ???

+2

Какие СУБД выходят? 'Left join ... где null' обычно лучше работает в MySQL, а' not exists' обычно работает лучше в некоторых других RDBMS (таких как Oracle и SQLServer). –

+1

Обязательно прочитайте об этом Аарон Бертран (только для Sql-сервера): [Я должен использовать NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT или NOT EXISTS?] (Http://www.sqlperformance.com/2012/12/T-SQL-запросы/лево-анти-полусоединение). –

+0

Это Jet, im, выполняющий запросы от vba/access – user1571823

ответ

0

Я бы сказал, что вам нужно индексы на все столбцы, которые принимают участие в объединении/где положения в том же порядке они появляются в пункте where. Удостоверьтесь, что у вас есть соответствующие индексы, и как not exists, так и join должны работать одинаково и быстро.

+0

Да, у меня есть индексы во всех столбцах в предложении where. Но, как уже упоминалось выше, способ, которым я ушел, не использует детексы. – user1571823