双外连接?

时间:2015-01-05 08:58:51

标签: sql join outer-join cross-join

我认为这是一个相当简单的问题,但我错过了一些东西。

我有3张桌子:

t_users : user_id, user_name
t_users_modules : user_id, module_id
t_modules : module_id, module_name

我想为每个module_name输出所有user_name的列表,并检查此用户是否确实在t_users_modules表中具有此权限。

是交叉加入吗?我从来没用过它。

我尝试了2个左外连接而没有成功。

2 个答案:

答案 0 :(得分:2)

是的,您使用交叉连接生成所有可能性,然后使用左连接来测试是否存在所需行:

select module_name, user_name,
     CASE WHEN um.user_id is not null THEN 1 ELSE 0 END as HasRight
from
   t_users u
       cross join
   t_modules m
       left join
   t_user_modules um
       on
           u.user_id = um.user_id and
           m.module_id = um.module_id

顺便提一下,如果你使用t_作为某种形式的前缀来识别表格,我建议删除它 - 在SQL的几乎所有地方,对象的类型可以从对象出现的位置识别出来在声明中。唯一的一般例外是表和视图是难以区分的 - 但这是一件好事 - 它们通常不应区分。

答案 1 :(得分:0)

select t1.user_name,t3.module_name,
CASE WHEN t1.user_id is not null then 1 else 0 end as "Has Right"
from t_users t1
join t_users_modules t2
on(t1.user_id=t2.user_id)
join t_modules  t3
on (t2.module_id=t3.module_id);