2015-01-05 51 views
1

我有我认为是一个相当简单的问题,但我失去了一些东西。双外连接?

我有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左外连接没有成功。

+1

请在你的问题中加入迄今为止所尝试的东西 –

+1

你可以添加一个带有输入和期望输出的样本吗? – Jens

+1

SQL Server?甲骨文? MySQL的?其他? – dario

回答

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

在这种特定情况下,CROSS JOIN有什么额外的贡献? (我有一种感觉,OP在提到术语交叉连接时并不真正知道他/她要求什么。) – jarlh

+0

也找到了答案。 这是一个交叉连接。虽然用子查询测试过,但你的答案是“更清洁”。 感谢您的帮助。 – LemonCat

+0

@jarlh - 因为听起来像OP *希望*在'users'和'modules'表之间生成笛卡尔连接。 –

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