2010-09-24 3 views
1

Aujourd'hui, mon patron a dit la requête SQL ci-dessous et est sorti sans l'expliquer. C'est bon. Mais je veux savoir comment ça marche.Quelqu'un peut-il expliquer cette requête SQL?

SELECT NAME 
    FROM PERMISSIONTOKENS 
WHERE ID IN (SELECT TOKENID 
       FROM ROLETOKENASSOCIATION 
       WHERE ROLEID = '1'); 

Répondre

9

Il y a deux requêtes ici.

La requête intérieure:

SELECT TOKENID FROM ROLETOKENASSOCIATION WHERE ROLEID = '1' 

obtiendrai tous les TOKENID s de ROLETOKENASSOCIATION qui ont un ROLEID de 1.

La requête externe:

SELECT NAME FROM PERMISSIONTOKENS WHERE ID IN(...) 

Cela obtenir tous les noms de qui ont une carte d'identité qui était dans le jeu de résultats de la requête interne.

Vous pourriez être en mesure de réécrire cela avec des jointures au lieu d'utiliser IN, si vous n'aimez pas la syntaxe de IN.

0

Il select nom de champ dans les lignes pour lesquelles l'ID se trouve dans cet ensemble de valeurs: toutes les TOKENID de la ligne de la table pour laquelle ROLETOKENASSOCIATION RoleId = « 1 ».

2
SELECT TOKENID FROM ROLETOKENASSOCIATION WHERE ROLEID = '1' 

Il sélectionne tous TOKENID où le RoleId est 1. Ceci est une sous-requête de la requête:

SELECT NAME FROM PERMISSIONTOKENS WHERE ID IN (...) 

Le (...) est l'ensemble de tous TOKENID sélectionné. Par conséquent, la requête entière sélectionnera les noms, où l'ID est l'un de ceux TOKENID avec ROLEID = 1.

0

Pour chaque TokenID dans la table RoleTokenAssociation, où le RoleId est "1", il retournera le nom de ce jeton de la table PermissionTokens.

5

Ceci est une sous-requête.

Fondamentalement, le SELECT interne récupère les ID de jeton, qui sont ensuite réinjectés dans la requête externe SELECT. Vous pouvez également obtenir le même en utilisant un INNER JOIN:

SELECT name 
     FROM PERMISSIONTOKENS pt 
INNER JOIN ROLETOKENASSOCIATION rta ON rta.TOKENID = pt.ID 
    WHERE rta.ROLEID = '1'; 
+0

+1 pour l'alternative syntaxe JOIN (vous me devança!) – FrustratedWithFormsDesigner

+0

Merci. +1 à vous pour l'explication détaillée de tout le reste :) –