Несколько предложений IN в SQL - PullRequest
0 голосов
/ 15 мая 2019

Я не уверен в функциональности предложения IN, поэтому я хочу знать, могу ли я безопасно выполнить запрос. Для того, что я понимаю при использовании предложения IN в SQL Server создает серию операторов OR: Так например

SELECT * FROM table WHERE column IN (1, 2, 3, 4, 5, 6)

Будет таким же, как:

SELECT * FROM table WHERE column = 1 OR column = 2 OR column = 3 OR column = 4 OR column = 5 OR column = 6

Но что происходит, когда выполняется нечто подобное:

SELECT * FROM table WHERE column IN (1, 2, 3) and column2 IN (4,5,6) and column 3 IN (5,7,8)

Здесь я хочу знать, если, например, если какое-либо значение из первого IN имеет два вхождения во втором, оно получит оба результата, или если оно выполнено в порядке, подобном 1 и 4 и 5 (первое значение в пределах IN пункты)

Я хочу выполнить запрос с 8 параметрами, которые мне нужно проверить в БД (отправка на C #), но я не хочу создавать супер-огромный запрос с большим количеством ИЛИ, как это (потому что это будет + 90 тыс. Записей)

 SELECT * FROM table WHERE (column = 1 and column2 = 4 and column3 = 5 ) or 
(column = 2 and column2= 5 and column3 = 7) OR ....

Или я не знаю, есть ли лучший подход для решения этой проблемы, я открыт для идей.

Спасибо

1 Ответ

5 голосов
/ 15 мая 2019

IN s - это отдельные условия, поэтому логика эквивалентна:

where (column1 = 1 or column1 = 2 or column1 = 3) and
      (column2 = 4 or column2 = 5 or column2 = 6)

Обратите внимание, что это логическая эквивалентность. Некоторые базы данных оптимизируют IN с помощью постоянных списков, например, путем создания двоичного дерева для поиска значений. Я не думаю, что SQL Server делает такую ​​оптимизацию, хотя.

Если вы хотите "выравнивание", некоторые базы данных - но не SQL Server - поддерживают кортежи, используя IN:

where (column1, column2) in ( (1, 4), (2, 5), (3, 5) )

И это всегда можно представить как:

where (column1 = 1 and column2 = 4) or
      (column1 = 2 and column2 = 5) or
      (column1 = 3 and column2 = 6)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...