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
.
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
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)
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;)
Vous pouvez soit utiliser des jointures
SELECT * FROM user U
INNER JOIN userType UT on U.code = UT.code
AND U.userType = UT.userType
Que diriez-vous de cela à la place:
SELECT user.* FROM user JOIN userType on user.code = userType.code AND user.userType = userType.userType
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