DGKumar Ответов: 2

Как избежать предложения in в SQL server?


У меня есть команда select, как показано ниже
Select U.UserIds from User as U join Admins as A on U.UserID == A.UserID where A.GoupId in (12,34,45,67,56,...)

В этом случае я получаю groupids из пользовательского интерфейса и добавляю в strinbuilder с разделением запятой для предложения IN.

Предположим, что у него больше идентификаторов, это снизит производительность.

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

Что я уже пробовал:

Select U.UserIds from User as U join Admins as A on U.UserID == A.UserID where A.GoupId in (12,34,45,67,56,...)

2 Ответов

Рейтинг:
1

CHill60

Альтернативой - не обязательно лучше, чем использование IN, - является использование функции string_split и внутреннего соединения. Пример:

-- Set up sample data
declare @user table (id int identity(1,1), d varchar(20))
declare @i int = 20
while @i > 0 
begin
	insert into @user default values
	set @i = @i - 1
end
declare @ids varchar(100) = '2,4,6,11,19'
Фактический запрос:
select u.* 
from @user u
inner join string_split(@ids,',') v on v.value = U.id
join Admins as A on U.UserID = A.UserID
Я предполагаю, что double-equals = = - это просто опечатка? Или вы не используете SQL Server?


Рейтинг:
0

OriginalGriff

На самом деле другого пути нет: если вы хотите ограничить выбор только определенным диапазоном идентификаторов, то IN-это правильный путь.
Единственное исключение из этого правила-когда диапазон фиксирован: если в предложении IN всегда одни и те же значения идентификаторов, то вы можете сохранить их в отдельной таблице и использовать соединение, чтобы "склеить" запрос вместе. Но... с точки зрения технического обслуживания, это кошмар!