如何使多个表具有多个连接

时间:2010-05-09 10:06:56

标签: sql join firebird

我需要将三个表连接在一起并获得结果组合。我尝试过使用左/右连接,但它们没有达到预期的效果。

例如:

表1 - 工作人员

id      name
1       John
2       Fred

表2 - STAFFMOBILERIGHTS

id      staffid     mobilerightsid      rights
--this table is empty--

表3 - MOBILERIGHTS

id      rightname
1       Login
2       View

我需要的是结果......

id  name    id  staffid mobilerightsid  rights  id  rightname
1   John    null    null    null        null    1   login
1   John    null    null    null        null    2   View
2   Fred    null    null    null        null    1   login
2   Fred    null    null    null        null    2   View

我尝试了以下内容:

SELECT *
  FROM STAFFMOBILERIGHTS SMR
  RIGHT JOIN STAFF STA
  ON STA.STAFFID = SMR.STAFFID
  RIGHT JOIN MOBILERIGHTS MRI
  ON MRI.ID = SMR.MOBILERIGHTSID

但是这只返回两行,如下所示:

id      name    id  staffid mobilerightsid  rights  id  rightname
null    null    null    null    null        null    1   login
null    null    null    null    null        null    2   View

我想要实现的目标是什么,如果是这样的话?

由于

2 个答案:

答案 0 :(得分:1)

从您的评论中,现在很清楚您需要cross join(包括来自员工和移动战队的所有行)。像这样的东西应该这样做

SELECT 
*
FROM Staff, MobileRights
LEFT OUTER JOIN StaffMobileRights ON StaffMobileRights.StaffId = Staff.Id

FROM子句指定我们将包括Staff表中的所有行以及MobileRights表中的所有行。因此,最终结果将包含(staff * MobileRights)行。

要从StaffMobileRights引入行,我们还需要连接到该表。我们使用LEFT OUTER连接来确保我们始终包含左侧(staff表中的行),但如果右侧没有行(StaffMobileRights表),我们也不会太烦恼。如果连接不存在行,则返回空值。

答案 1 :(得分:0)

你可能要问的是看到null哪里没有权利。在矩形样式中始终返回结果,这是通过简单连接表示它的唯一方法:

从PaulG的查询中我改变了一点,总是从STAFF表中获取所有内容。

SELECT 
*
FROM STAFF
RIGHT OUTER JOIN StaffMobileRights ON StaffMobileRights.StaffId = Staff.Id
INNER JOIN MobileRights ON MobileRights.Id = StaffMobileRights.MobileRightsId