Выберите где не в другой таблице - PullRequest
0 голосов
/ 02 марта 2012

Я пытаюсь выбрать все представления, которых нет в таблице котировок или политик.

select
COUNT (*)
from Submission S
where
(S.Submission_Status='New' OR S.Submission_Status='Quoted to Agent' OR S.Submission_Status='Cleared')
and YEAR(S.Submission_Date) >= YEAR( GETDATE())
and S.Submission not in (select distinct Submission from Policy where Submission is not null) 
and S.Submission not in (select distinct Submission from Quote where Submission is not null)

Этот запрос возвращает хорошие результаты, но запрос выполняется очень медленно (поскольку в Политике много записей иТаблицы цитирования).Можно ли сделать более быструю версию этого запроса (я думаю, с JOIN)?

Спасибо,
Илия

РЕДАКТИРОВАТЬ:
Я пробовал это, но результаты не совпадаютпервый запрос:
enter image description here

Ответы [ 5 ]

0 голосов
/ 02 марта 2012

Я бы попробовал заменить not in на not exist, таким образом, вы не distinct. Окончательное решение - если вы уверены, что производительность снижается из-за большого количества записей в policy и quote, создайте индексированное представление для каждой таблицы (select distinct …). В некоторых выпусках sqlserver вам даже не нужно менять запрос, он будет автоматически использовать представление

0 голосов
/ 02 марта 2012

Изменить эту часть:

YEAR(S.Submission_Date) >= YEAR( GETDATE())

На:

S.Submission_Date >= DateAdd(Year, DateDiff(Year, 0, GETDATE()), 0)

Этот код позволит использовать индекс Submission_Date, если он существует.Это также функционально эквивалентно вашему исходному утверждению.

0 голосов
/ 02 марта 2012
select
COUNT (*)
from Submission S
where S.Submission_Status IN ('New','Quoted to Agent','Cleared')
and YEAR(S.Submission_Date) >= YEAR( GETDATE())
and S.Submission not in (select distinct Submission from Policy p FULL OUTER JOIN Quote q ON  p.Submission=q.Submission where Submission is not null)
0 голосов
/ 02 марта 2012

вы могли бы использовать LEFT OUTHER JOIN вместо проверки Sub-Select, если Submission==null

В основном вам нужно получить несоответствующие записи.

эта ссылка может помочь вамрефакторинг вашего запроса

Извлечение несоответствующей записи с помощью объединения

0 голосов
/ 02 марта 2012

добавить индексы для Submission_Status и S.Submission_Date, Submission

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...