今天,我的老板告诉下面的SQL查询并没有解释就出去了。它的工作性很好。 但我想知道它的工作方式。
SELECT NAME
FROM PERMISSIONTOKENS
WHERE ID IN (SELECT TOKENID
FROM ROLETOKENASSOCIATION
WHERE ROLEID = '1');
答案 0 :(得分:9)
这里有两个查询。
内部查询:
SELECT TOKENID FROM ROLETOKENASSOCIATION WHERE ROLEID = '1'
将获得TOKENID
ROLETOKENASSOCIATION
ROLEID
1
的所有SELECT NAME FROM PERMISSIONTOKENS WHERE ID IN(...)
。
外部查询:
PERMISSIONTOKENS
这将获得IN
中具有内部查询结果集中ID的所有名称。
如果您不喜欢IN
的语法,则可以使用联接重新编写此代码,而不是使用{{1}}。
答案 1 :(得分:5)
这是一个子查询。
基本上,内部SELECT
检索令牌ID,然后将其反馈到外部SELECT
查询中。您也可以使用INNER JOIN
:
SELECT name
FROM PERMISSIONTOKENS pt
INNER JOIN ROLETOKENASSOCIATION rta ON rta.TOKENID = pt.ID
WHERE rta.ROLEID = '1';
答案 2 :(得分:2)
SELECT TOKENID FROM ROLETOKENASSOCIATION WHERE ROLEID = '1'
它选择ROLEID为1的所有TOKENID。这是查询的子查询:
SELECT NAME FROM PERMISSIONTOKENS WHERE ID IN (...)
(...)是所有选择的TOKENID的集合。因此,整个查询将选择NAME,其中ID是具有ROLEID = 1的TOKENID之一。
答案 3 :(得分:0)
从ID为这组值的行中选择字段NAME:表ROLETOKENASSOCIATION的行中所有TOKENID,其中ROLEID ='1'。
答案 4 :(得分:0)
对于RoleTokenAssociation表中RoleId为“1”的每个TokenID,它将从PermissionTokens表返回该令牌的名称。