Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在三个表之间查询数据_Sql_Sql Server - Fatal编程技术网

Sql 在三个表之间查询数据

Sql 在三个表之间查询数据,sql,sql-server,Sql,Sql Server,只是想在我尝试之前确认一下我做的是否正确。连接有点弱 我有三张桌子: USER PERSONGROUPTOPERRSON PERSONGROUPS id userId groupID firstName groupId groupName lastN

只是想在我尝试之前确认一下我做的是否正确。连接有点弱

我有三张桌子:

USER                     PERSONGROUPTOPERRSON            PERSONGROUPS
    id                     userId                          groupID
    firstName              groupId                         groupName
    lastName          
    lastUpdated
我需要属于组名中带有“志愿者”的组的所有用户

这个问题正确吗

SELECT
    a.firstName, a.lastName, a.lastUpdated
FROM
    user as a, persongrouptoperson as b
INNER JOIN ON
    a.id = b.userId
WHERE
    b.groupId
IN 
    (SELECT
        groupID
     FROM
        persongroups
     WHERE
        groupName like '%volunteer%'
     );

可以使用内部联接来执行此操作。我添加了distinct,以防您的用户可以在多个组中使用“志愿者”一词。我还建议对表使用更直观的别名,而不是a、b、c

select distinct
   u.firstName
 , u.lastName
 , u.lastUpdated
from User as u
  inner join PersonGroupToPerson as pgp on u.id = pgp.userId
  inner join PersonGroup as pg on pgp.groupId = pg.groupId
where pg.GroupName like '%volunteer%'

不完全是。试着这样做:

SELECT user.firstname, user.lastname, user.lastupdated
FROM user
INNER JOIN persongrouptoperson ON user.id = persongrouptoperson.userid
INNER JOIN persongroups ON persongrouptoperson.groupid = persongroups.groupid
WHERE groupName like '%volunteer%'
想法是将所有三个表连接在一起。通过内部联接,您可以非常简单地实现这一点。您只需链接常用键即可。例如,user表中的userid字段与person-group-to-person表中的userid字段相匹配。然后,person groups表中的group id字段与person group to person表中的group id字段匹配。将它们与ON语句链接


链接表后,您可以想象每一行都包含用户信息和组信息。因此,where子句可以直接调用您在该组信息中要查找的内容。

运行它时是否有效?出于多种原因,我还没有尝试过。这就是为什么我希望专家们在我尝试之前仔细检查一下。这只是一个精选语句,如果你运行它失败了,就不会有什么不好的事情发生。更直观的别名也是一个好主意,正如其他答案之一所提到的。
SELECT user.firstname, user.lastname, user.lastupdated
FROM user
INNER JOIN persongrouptoperson ON user.id = persongrouptoperson.userid
INNER JOIN persongroups ON persongrouptoperson.groupid = persongroups.groupid
WHERE groupName like '%volunteer%'