来自2个表的SQL select语句

时间:2010-05-05 19:47:22

标签: sql select

我有一个小问题。

我有2张桌子

会员和经理

成员有:memberID,姓名,地址 经理有:memberID,EditRights,DeleteRights

EditRights和DeleteRights的类型为bit。

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

我想选择所有成员的ID,姓名和地址,以及管理员显示的成员,如果他们有编辑权和/或删除权。

SO:

Exmaple数据

成员:

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

任何帮助都会很棒

3 个答案:

答案 0 :(得分:5)

SELECT * FROM members LEFT OUTER JOIN managers ON member.id = manager.id

我不建议将权限列连接到像“无权限”这样的字符串中 - 这样可以更好地留给应用程序的表示方。以原生形式返回尽可能多的数据,以便以后更轻松地使用它。

答案 1 :(得分:1)

你想要的是一个左连接

答案 2 :(得分:1)

我认为这更接近你所要求的。 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