【问题标题】:double outer join?双外连接?
【发布时间】:2015-01-05 08:58:51
【问题描述】:

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

我有 3 张桌子:

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 表中具有此权限。

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

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

【问题讨论】:

  • 请在问题中添加您迄今为止尝试过的内容
  • 您能否添加一个带有输入和预期输出的示例?
  • SQL Server?甲骨文? MySQL?其他?

标签: sql join outer-join cross-join


【解决方案1】:

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

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 中的几乎所有位置,对象的类型都可以从对象出现在陈述。唯一的一般例外是表和视图无法区分 - 但这是一件好事 - 通常不应该区分它们。

【讨论】:

  • 在这种特定情况下,CROSS JOIN 有什么额外贡献? (我有一种感觉,当提到交叉加入这个词时,OP 并不真正知道他/她在要求什么。)
  • 也找到了答案。这是一个交叉连接。虽然使用子查询进行了测试,但您的答案是“更干净”。感谢您的帮助。
  • @jarlh - 因为在我看来,OP 想要 生成 usersmodules 表之间的笛卡尔连接。
  • 好吧,你可能绝对是对的,有时很难理解真正的问题,即 OP 的真正要求。
  • 是的,我想要笛卡尔连接,但我并不知道。我在交叉连接的正确轨道上。
【解决方案2】:
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);

【讨论】:

    猜你喜欢
    • 2014-12-04
    • 2010-09-05
    • 2010-12-06
    • 2013-03-13
    • 2017-05-24
    • 2013-12-10
    • 2012-04-03
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多