2015-01-29 4 views
0

У меня есть таблица с столбцами IDCourse и IDProvince; курс может быть передан в разных провинциях. Я хотел бы получить все значения IDCourse, которые не передаются в заданном ProvinceID.Запрос SQL Server для фильтрации строк не содержит значения

Например.

IDCourse  IDProvince 
------------------------ 
    1  100 
    1  102 
    1  105 
    2  100 
    2  108 
    3  109 
    3  107 
    4  100 
    4  105 
    4  106 
    5  102 
    5  108 

Я хотел бы получить все, конечно, не сообщается на IDProvince = 100, так что результат будет только IDCourse 3 и 5

я мог бы сделать простой запрос, как

Select IDCourse 
from MyTable 
Where IDCourse not in (Select IDCourse 
         From Mytable 
         Where IDProvince = 100) 

Но я хочу оптимизировать его, есть ли другой способ, которым я могу выполнить этот запрос? Кстати, это всего лишь пример, запрос на самом деле больше.

Спасибо!

+0

Я использую сервер Sql – user2112420

+0

Вы пробовали «... не в (выберите DISTINCT IDCourse ...)»? –

+1

@GiacomoDegliEsposti: Это действительно имеет значение? Не оптимизирует ли SQL Server лучше?!? – jarlh

ответ

0

Два других способов для достижения тех же результатов, что может дать равную или лучшую производительность, чтобы использовать либо not exists или except:

Использование not exists (должно дать тот же план выполнения, как с помощью not in:

SELECT IDCourse FROM MyTable m 
WHERE NOT EXISTS (
    SELECT 1 FROM Mytable 
    WHERE IDProvince = 100 
    AND idcourse = m.idcourse 
) 

Использование except должно дать несколько иной план выполнения (и немного улучшит данные выборки), но я не сделал бы никаких выводов из этого ограниченный размер образца):

SELECT IDCourse FROM MyTable 
EXCEPT 
SELECT IDCourse FROM MyTable WHERE IDProvince = 100 

Я не могу сказать вам, если какой-либо из запросов будет работать лучше, это зависит от индексации и других факторов, поэтому попробуйте сами и посмотрите :)

+0

, но кроме того, что это не так, как НЕ В? – user2112420

+0

@ user2112420 Это не совсем то же самое, что и на множестве, но он даст тот же результат (без дубликатов). – jpw

0

, чтобы оптимизировать его - с помощью переменной sql-сервера используйте такой же план кеша независимо от ввода в IDProvince. просто изменить переменной

DECLARE @IDProvince int 
    SELECT IDCourse 
    FROM tbl 
    WHERE IDCourse NOT IN (SELECT IDCourse 
         FROM tbl 
         WHERE [email protected]) 
+0

Блоки кода сами по себе не являются обычно полезными ответами. Пожалуйста, объясните, что показывает код, который вы показываете, и почему/как этот код отвечает на вопрос. –

+1

, чтобы оптимизировать его - с помощью переменной сервер sql использует один и тот же план кеша независимо от ввода в IDProvince.просто измените переменную –

+0

Спасибо! Было бы даже лучше, если бы вы отредактировали объяснение в своем ответе :) –

0

Я не совсем уверен, если это вписывается в больший запрос (так как мы не имеем этот код), но это может быть столь же просто, как:

SELECT IDCourse 
FROM TABLE 
WHERE IDProvince <> 100 
GROUP BY IDCourse 

Или я пропустил что-то в вашем вопросе?

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