Какой подход я должен использовать, если мне нужно выбрать данные, КРОМЕ другого набора данных? - PullRequest
1 голос
/ 14 ноября 2011

Какой подход я должен использовать для построения моего запроса SQL, если мне нужно выбрать данные, кроме некоторых других данных?

Например, мой

Я хочу выбрать все данные избаза данных ИСКЛЮЧИТЬ этот набор результатов:

SELECT *
FROM table1
WHERE table1.MarketTYpe = 'EmergingMarkets'
AND IsBigOne = 1
AND MarketVolume = 'MIDDLE'
AND SomeClass = 'ThirdClass'

Должен ли я использовать

  • NOT IN (набор результатов aboe)
  • Или я получу ОБРАТНОЕ из условий, таких как! = Насекомое = и т. Д.
  • Или?

Можете ли вы посоветовать?

Ответы [ 5 ]

6 голосов
/ 15 ноября 2011

Использовать конструкцию EXCEPT ?

SELECT *
FROM table1
EXCEPT
SELECT *
FROM table1
WHERE table1.MarketTYpe = 'EmergingMarkets'
AND IsBigOne = 1
AND MarketVolume = 'MIDDLE'
AND SomeClass = 'ThirdClass'

Обратите внимание, что EXCEPT и NOT EXISTS дают один и тот же план запроса, используя "левые анти-полусоединения".

NOT IN (subquery with above) может не давать правильные результаты, если в подзапросе есть значения NULL, поэтому я бы не использовал

Я бы избежал отрицания в WHEREпункт, потому что он не может быть сразу прочитан
Поскольку комментарии показывают ответ Михаэля ...

Подробнее о «всех строках, кроме некоторых строк», см. эти:

2 голосов
/ 15 ноября 2011

Какой механизм базы данных?

Оператор минус в ORACLE Кроме оператора в SQL Server

2 голосов
/ 14 ноября 2011

Самый простой и, вероятно, самый быстрый способ - просто инвертировать условия:

SELECT *
FROM table1
WHERE table1.MarketTYpe <> 'EmergingMarkets'
  OR IsBigOne <> 1
  OR MarketVolume <> 'MIDDLE'
  OR SomeClass <> 'ThirdClass'

Вероятно, для этого потребуется гораздо меньше ресурсов, чем для NOT IN().Вы можете захотеть сравнить их, чтобы быть уверенным, но выше, вероятно, будет быстрее.

1 голос
/ 15 ноября 2011

Мне нравится ответ ГБН, но другой способ сделать это может быть:

SELECT *
FROM table1
WHERE NOT (table1.MarketTYpe = 'EmergingMarkets'
AND IsBigOne = 1
AND MarketVolume = 'MIDDLE'
AND SomeClass = 'ThirdClass')
1 голос
/ 14 ноября 2011

Используйте NOT IN, потому что это дает понять, что вы хотите установить набор в главном операторе выбора, исключая подмножество в операторе NOT IN select.

...