双外连接?

double outer join?

我有一个我认为相当简单的问题,但我遗漏了一些东西。

我有 3 tables :

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

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

它是交叉连接吗?我从来没有用过它。

我尝试了 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 的几乎所有地方,对象的类型是可从对象在语句中出现的位置识别。唯一的一般例外是表和视图无法区分 - 但这是一件好事 - 它们通常不应该被区分。

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);