PostgreSQL中使用二进制逻辑连接查询

问题描述:

我有3个表,看起来依稀像这样:PostgreSQL中使用二进制逻辑连接查询

Users 
---------- 
UserID 
Name 
Phone 

User Groups 
----------- 
GroupID 
Activity 

Group Membership 
--------------- 
UserID 
GroupID 

Independent Actives 
------------------- 
UserID 
Activity 

的想法是,用户可以作为一个整体的一部分,或者对自己的执行活动。我想要做的是让所有参与某项活动的人都归来。到目前为止,我所能写的内容让我返回所有进行该活动的用户。我想补充的是能够看到独立完成活动的人员。这是我到目前为止有:

SELECT                 
users.name, users.phone, user_groups.activity 
FROM users 
INNER JOIN group_membership ON group_membership.userID = users.userID 
INNER JOIN user_groups ON user_groups.groupID = group_membership.groupID 
WHERE user_groups.activity = 'Knitting'; 

以上位工作正常,它显示了所有是做针织组的一部分用户,但我也希望它以显示所有独立编织的用户。这是我尝试添加:

SELECT                 
users.name, users.phone, user_groups.activity 
FROM users 
INNER JOIN group_membership ON group_membership.userID = users.userID 
INNER JOIN user_groups ON user_groups.groupID = group_membership.groupID 
INNER JOIN independent_activity ON independent_activity.userID = users.userID 
WHERE user_groups.activity = 'Knitting' OR independent_activity.activity = 'Knitting'; 

这里的问题是语法,我明白,我想要做的算法,但我不知道如何将其转移到SQL等任何帮助非常感谢。

你可以在这种情况下

SELECT users.NAME 
    ,users.phone 
    ,user_groups.activity 
FROM users 
INNER JOIN group_membership ON group_membership.userID = users.userID 
INNER JOIN user_groups ON user_groups.groupID = group_membership.groupID 
WHERE user_groups.activity = 'Knitting' 

UNION 

SELECT users.NAME 
    ,users.phone 
    ,independent_activity.activity 
FROM users 
INNER JOIN independent_activity ON independent_activity.userID = users.userID 
WHERE independent_activity.activity = 'Knitting'; 

您可能还需要查找一个UNIONUNION ALL之间的差异,决定了你的套件要求一个使用UNION

你已经从SoulTrain得到了一个工作答案。不过,为了完整起见,我想提一提,您不必加入所有这些表格。 (你可以在这里使用外部连接并删除与DISTINCT重复的匹配,但这不是必须的,你不必查询用户表两次,也不需要UNION做不同的工作。)

只需从要显示数据的表中选择一个表,即用户表,然后使用EXISTS或IN来仅获取那些在一组或另一组中的用户。

select name, phone 
from users 
where userid in 
(
    select userid 
    from independent_actives 
    where activity = 'Knitting' 
) 
or userid 
(
    select userid 
    from group_membership 
    where groupid in (select groupid from user_groups where activity = 'Knitting') 
)