SQL Server - предложение IN с несколькими полями - PullRequest
18 голосов
/ 15 декабря 2010

Можно ли включить в предложение IN несколько полей? Примерно так:

select * from user
where code, userType in ( select code, userType from userType )

Я использую MS SQL Server 2008


Я знаю, что этого можно достичь с помощью объединений и существует, я просто хотел узнать, можно ли это сделать с помощью предложения IN.

Ответы [ 8 ]

15 голосов
/ 15 декабря 2010

Не так, как вы отправили. Вы можете вернуть только одно поле или тип для 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
9 голосов
/ 15 декабря 2010

Вы можете использовать такую ​​форму:

select * from user u
where exists (select 1 from userType ut
              where u.code = ut.code
                and u.userType = ut.userType)
4 голосов
/ 26 марта 2015

Только с чем-то ужасным, как

select * from user
where (code + userType) in ( select code + userType from userType )

Затем вы должны управлять нулями и объединением чисел, а не добавлять их, выполнять приведение, код 12 и тип пользователя 3 против кода 1 и тип пользователя 23, и ...

Итак, пошли: решение, которое не использует соединения или существует ... и множество причин, по которым вы не должны его использовать;)

0 голосов
/ 13 ноября 2015

Я должен был сделать что-то очень похожее, но 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]) 

РЕДАКТИРОВАТЬ: Теперь я смотрю, это очень близко к ответу @ v1v3kn

0 голосов
/ 31 января 2013
select * from user
where (code, userType) in ( select code, userType from userType );
0 голосов
/ 15 декабря 2010

Вы можете использовать соединения

SELECT * FROM user U 
INNER JOIN userType UT on U.code = UT.code 
AND U.userType = UT.userType
0 голосов
/ 15 декабря 2010

Я не думаю, что запрос достаточно переносим, ​​было бы безопаснее использовать что-то вроде

select * from user
where code in ( select code from userType ) and userType in (select userType from userType)
0 голосов
/ 15 декабря 2010

Как насчет этого вместо:

SELECT user.* FROM user JOIN userType on user.code = userType.code AND user.userType = userType.userType
...