Предложение SQL Server - IN с несколькими полями
Можно ли включить в предложение IN
несколько полей? Что-то вроде следующего:
select * from user
where code, userType in ( select code, userType from userType )
Я использую ms sql server 2008
Я знаю, что это может быть достигнуто с помощью соединений и существует, я просто хотел знать, можно ли это сделать только с предложением IN
.
Ответы
Ответ 1
Не то, как вы опубликовали. Вы можете вернуть только одно поле или тип для IN
.
Из MSDN (IN
):
test_expression [ NOT ] IN
( subquery | expression [ ,...n ]
)
subquery - Is a subquery that has a result set of one column.
This column must have the same data type as test_expression.
expression[ ,... n ] - Is a list of expressions to test for a match.
All expressions must be of the same type as
test_expression.
Вместо IN
вы можете использовать JOIN
, используя два поля:
SELECT U.*
FROM user U
INNER JOIN userType UT
ON U.code = UT.code
AND U.userType = UT.userType
Ответ 2
Вы можете использовать такую форму:
select * from user u
where exists (select 1 from userType ut
where u.code = ut.code
and u.userType = ut.userType)
Ответ 3
Только с чем-то ужасным, например
select * from user
where (code + userType) in ( select code + userType from userType )
Затем вам нужно управлять нулями и конкатенировать числа, а не добавлять их, а также кастинг и код из 12 и тип пользователя из 3 и код 1 и тип пользователя из 23 и...
Итак, вы идете: решение, которое не использует объединения или существует.. и множество причин, почему вы не должны его использовать;)
Ответ 4
Как насчет этого:
SELECT user.* FROM user JOIN userType on user.code = userType.code AND user.userType = userType.userType
Ответ 5
Вы можете использовать соединения
SELECT * FROM user U
INNER JOIN userType UT on U.code = UT.code
AND U.userType = UT.userType
Ответ 6
Мне нужно было сделать что-то очень похожее, но EXISTS не работали в моей ситуации. Вот что сработало для меня:
UPDATE tempFinalTbl
SET BillStatus = 'Non-Compliant'
WHERE ENTCustomerNo IN ( SELECT DISTINCT CustNmbr
FROM tempDetailTbl dtl
WHERE dtl.[Billing Status] = 'NEEDS FURTHER REVIEW'
AND dtl.CustNmbr = ENTCustomerNo
AND dtl.[Service] = [Service])
AND [Service] IN ( SELECT DISTINCT [Service]
FROM tempDetailTbl dtl
WHERE dtl.[Billing Status] = 'NEEDS FURTHER REVIEW'
AND dtl.CustNmbr = ENTCustomerNo
AND dtl.[Service] = [Service])
EDIT: теперь, когда я смотрю, это очень близко к ответу @v1v3kn
Ответ 7
Я не думаю, что запрос довольно портативный, было бы безопаснее использовать что-то вроде
select * from user
where code in ( select code from userType ) and userType in (select userType from userType)
Ответ 8
select * from user
where (code, userType) in ( select code, userType from userType );