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';
您可能还需要查找一个UNION
和UNION 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')
)