【问题标题】:SQL select statement from 2 tables来自 2 个表的 SQL 选择语句
【发布时间】:2010-05-05 19:47:22
【问题描述】:

我有一个小 sql 问题。

我有两张桌子

成员和经理

成员有:memberID、Name、Address 经理有:memberID、EditRights、DeleteRights

EditRights 和 DeleteRights 是位类型。

经理与会员有关系,因为他们本身就是会员。

我想选择所有成员的 ID、姓名和地址,并为作为经理的成员显示他们是否具有编辑权限和/或删除权限。

所以:

示例数据

成员:

ID, Name, Address
1, tom, 2 flat
2, dan, 3 flat
3, ben, 4 flat
4, bob, 6 flat
5, sam, 9 flat

经理:

ID, Editrights, deleterights 
2, 0, 1
4, 1, 1
5, 0, 0

我想显示这样的选择:

1, tom, 2 flat, no rights
2, dan, 3 flat, Delete
3, ben, 4 flat, no rights
4, bob, 6 flat, Edit&Delete
5, sam, 9 flat, no rights

任何帮助都会很棒

【问题讨论】:

标签: sql select


【解决方案1】:
SELECT * FROM members LEFT OUTER JOIN managers ON member.id = manager.id

我不建议将权限列连接成诸如“无权限”之类的字符串——这最好留给应用程序的展示端。尽可能多地以其原生形式返回数据,以便您以后更轻松地使用它。

【讨论】:

  • 更新以利用@Andrew 的洞察力:您需要一个 LEFT OUTER JOIN 来获取所有成员,无论他们是否在 manager 表中有条目。
【解决方案2】:

你想要的是左连接

【讨论】:

    【解决方案3】:

    我认为这更接近您的要求。 OUTER 术语是让您获得不在 Managers 表中的成员的原因。 CASE.. + 的东西可能需要一些调整才能与您正在使用的任何数据库一起使用,但您明白了 - 如果可以的话,@ABach 关于在您的演示代码中处理这个问题是正确的。

    SELECT m.ID, m.Name, m.Address,
    CASE WHERE g.EditRights IS NULL AND g.deleterights IS NULL THEN 'no rights'
    ELSE
      CASE WHERE g.Editrights = 1 THEN 'Edit' END
      + CASE WHERE g.Editrights = 1 AND g.deleterights = 1 THEN '&' END
      + CASE WHERE g.deleterights = 1 THEN 'Delete' END
    END AS rights
    FROM Members AS m
    LEFT OUTER JOIN Managers AS g ON g.ID = m.ID
    

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      相关资源
      最近更新 更多