Select Distinct sur Requête de Jointure Interne de filtrage par plusieurs valeurs sur une seule colonne?

Donc, je dois dire, le SQL est de loin mon plus faibles de côté en tant que développeur. Peut-être ce que je suis en train d'accomplir est assez facile. J'ai quelque chose comme ceci (Ce n'est pas le modèle réel, mais dans le but de rendre plus simple à comprendre sans perdre trop de temps à l'expliquer, je suis venu avec un exemple qui imite exactement le tableau des relations que j'ai à utiliser).
D'une part, une table, nous allons l'appeler, les "Utilisateurs". Les colonnes comme une clé primaire "UserId", "nom d'utilisateur", et ainsi de suite.

Prochaine, un autre Tableau, "Licences". Porte 1:N avec l'utilisateur, chaque licence appartient à un seul utilisateur, un utilisateur peut avoir plusieurs licences. Ainsi, nous aurions un PK IdLicense, un FK IdUser, et ainsi de suite.

Prochain, une table appelée "Équipements". ici, nous avons défini les différents équipements. IdEquipment, EquipmentName. Pas beaucoup plus à dire à ce sujet.

Enfin, une table qui crée une N:M relation entre les "Licences" et "Équipements". lorsqu'un utilisateur définit une licence, il est possible de spécifier les différents équipements que la licence leur permet de manipuler. Ainsi, une licence peut se rapporter à plusieurs équipements, et d'une pièce d'équipement peut se rapporter à plusieurs licences.

La vraie affaire vient ici. J'ai été ordonné de mettre sur pied un système de recherche qui vous permet d'obtenir des utilisateurs en fonction de l'équipement qu'ils sont qualifiés pour gérer.Il est possible de faire une sélection multiple, de sorte que vous la recherche pour les utilisateurs qui sont qualifiés pour gérer l'équipement "A", "B" et "C". Par exemple, nous avons 2 utilisateurs, James et Dave. James a 2 licences, Dave en a un. James est qualifié pour l'utilisation des machines "A" et "D" sur sa première licence, "B" et "C" sur le second. Dave est qualififed de gérer l'équipement de type "B" et "C" sur sa licence. Si quelqu'un essaie de recherche pour les utilisateurs d'être en mesure de gérer l'équipement "A","B" ET "C" ne James serait le retour de l'enregistrement.

Jusqu'à présent, je suppose que j'aurais du faire quelque chose comme

SELECT DISTINCT IdUser
FROM  Users
INNER JOIN Licenses
   ON Licenses.IdUser = Users.idUser
INNER JOIN LicensesEquipments
   ON LicensesEquipments.IdLicense = Licenses.IdLicense
INNER JOIN Equipment
   ON Equipment.IdEquipment = LicensesEquipments.IdEquipment

WHERE Equipment.IdEquipment = ??

Comment puis-je filtrer ce sur l'ensemble des 3 différents idEquipments pour "A", "B" et "C".?
Évidemment, je ne peux pas faire
OÙ de l'Équipement.IdEquipment = 1 et de l'Équipement.IdEquipment = 2 depuis une cellule ne peut pas être égal à 2 valeurs différentes.
Ni que je peux faire
OÙ de l'Équipement.IdEquipment = 1 ou de l'Équipement.IdEquipment = 2 car l'utilisation d'un OU signifierait que tout utilisateur disposant d'au moins l'UNE des possibilités serait considéré comme un résultat valide, et je suis à la recherche de celui qui a TOUS les 3 différents équipements sur cette affaire.

Au début, je suppose que je serais obligé de créer plusieurs jointures internes à la table de l'équipement, à l'aide d'alias, de le faire autant de fois que les filtres de l'équipement j'ai peut-être, et l'utilisation de chaque alias avec un filtre différent. Mais mon code superviseur est venu et m'a dit de l'oublier, car il a dit que les rendrait trop coûteux et de plus en plus de filtres ajoutés (même s'il m'a donné pas de meilleure alternative...)

OriginalL'auteur Hobbes | 2012-10-31