我认为这是一个很简单的问题,但我遗漏了一些东西。
我有三张桌子:
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表中是否确实拥有这个权限。
是交叉连接吗?我从来没用过。
我试了两个左外连接,但没有成功。
发布于 2015-01-05 09:03:06
是的,您使用交叉连接来生成所有的可能性,然后使用左联接来测试是否存在所需的行:
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中的几乎所有地方,对象的类型都可以从该对象出现在语句中的位置识别。唯一的例外是表和视图是无法区分的--但这是一件好事--它们一般不应该被区分开来。
发布于 2015-01-05 09:13:52
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);https://stackoverflow.com/questions/27776145
复制相似问题