web-dev-qa-db-fra.com

SQL Server - Clause IN avec plusieurs champs

Est-il possible d'inclure dans une clause IN plusieurs champs? Quelque chose comme ce qui suit:

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

J'utilise ms SQL Server 2008


Je sais que cela peut être réalisé avec des jointures et existe, je voulais juste savoir si cela pouvait être fait avec la clause IN.

18
opensas

Pas la façon dont vous avez posté. Vous ne pouvez renvoyer qu’un seul champ ou type pour que IN fonctionne.

De 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.

Au lieu de IN, vous pouvez utiliser un JOIN en utilisant les deux champs:

SELECT U.* 
FROM user U
  INNER JOIN userType UT
    ON U.code = UT.code
    AND U.userType = UT.userType
15
Oded

Vous pouvez utiliser un formulaire comme celui-ci:

select * from user u
where exists (select 1 from userType ut
              where u.code = ut.code
                and u.userType = ut.userType)
9
cdhowie

Seulement avec quelque chose d'horrible, comme

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

Ensuite, vous devez gérer les valeurs nulles et concaténer les nombres plutôt que de les ajouter, et le casting, et un code de 12 et un type d'utilisateur de 3 vs un code de 1 et un type d'utilisateur de 23, et ...

Alors voilà: une solution qui n'utilise pas de jointure ou n'existe pas .. et une foule de raisons pour lesquelles vous ne devriez pas l'utiliser;)

4
Caius Jard

Vous pouvez soit utiliser des jointures 

SELECT * FROM user U 
INNER JOIN userType UT on U.code = UT.code 
AND U.userType = UT.userType
0
pavanred

Que diriez-vous de cela à la place:

SELECT user.* FROM user JOIN userType on user.code = userType.code AND user.userType = userType.userType
0
Sam Holloway

Je devais faire quelque chose de très similaire mais EXISTS ne fonctionnait pas dans ma situation. Voici ce qui a fonctionné pour moi:

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: Maintenant que je regarde, ceci est très proche de la réponse de @ v1v3kn

0
Rick Savoy