2015-08-21 5 views
0

У меня есть следующая таблица для хранения документов. Документ может быть либо книгой с несколькими страницами, нумерацией страниц, начиная с 0 или документа с одной страницей.Улучшение производительности запроса

Category 
Title 
PageNo - integer 
LineNo integer 
Key 
Value 

Мне нужен запрос, который вытягивает все ключи из таблицы, которые принадлежат к одной странице документов и category1.

У меня есть следующий запрос:

SELECT DISTINCT Key 
FROM Materials 
WHERE Category='Category1' and Key NOT IN 
(SELECT DISTINCT Key 
from Materials 
WHERE Category='Category1' 
and PageNo>0) 

Запрос отлично работает за исключением всех материалов, которые имеют более 1 страницы. Я хотел переписать запрос, чтобы улучшить его с точки зрения производительности, а также во избежание повторения кода, такого как ключевое слово DISTINCT и предложение WHERE, если это возможно. Я был бы признателен за любые указатели в правильном направлении.

+0

Вы могли бы избежать повторения категории параметр/буквенное значение («category1») путем соотнесения во внутреннем запросе 'из материалов м2, где m2.Category = Materials.Category'. Но я думаю, что ответ «группа за» лучше в любом случае. – shawnt00

ответ

3

, если PageNo не является нулевым

SELECT Key 
FROM Materials 
WHERE Category='Category1' 
GROUP BY Key 
having max(PageNo) <= 0 

, если PageNo обнуляемого

SELECT Key 
FROM Materials 
WHERE Category='Category1' 
GROUP BY Key 
having max(isnull(PageNo,0)) <= 0 
+2

Или, может быть, просто 'с count (*) = 1' лучше избегать необходимости заботиться о том, как работает нумерация страниц. – shawnt00

+0

Отлично! Благодаря! – ElenaDBA

+0

@ shawnt00 Если это то, что они хотят, тогда да – Paparazzi

1

Удалить второй DISTINCT

  • Добавление DISTINCT, будет добавить дополнительный сканирования таблицы

запрос должен быть:

SELECT DISTINCT Key 
FROM Materials 
WHERE Category='Category1' 
and Key NOT IN 
(SELECT Key 
from Materials 
WHERE Category='Category1' 
and PageNo>0) 
+0

Есть изменения, которые Query Optimizer будет игнорировать это заявление DISTINCT. Или добавьте само по себе, –

+0

Почему существует необходимость в PageNo <1? – ElenaDBA

+0

@ElenaDBA - Удалено .. Спасибо. – Leptonator

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