SQL - 从多个表中选择,其中一个表中没有结果

时间:2018-05-25 10:34:15

标签: sql oracle select join many-to-many

我认为这个问题之前可能已经得到了回答,但是我无法找到它:我发现的所有结果都不能解决这个问题......

假设我的数据库有以下表格和关系(我无法改变它们):

  • 实体:用户,工作组和队列
  • 一个用户可以包含在许多工作组中,一个工作组可以拥有多个用户。
  • 一个工作组可以有多个队列,一个队列可以属于许多工作组。
  • 有两张桌子可以制作这些"多对多"关系:m2m_user_wg,m2m_wg_queue

我有这样的查询:

SELECT U.LOGIN, WG.WORKGROUP, Q.QUEUE
FROM USER U, M2M_USER_WG MUW, WORKGROUP W, M2M_WG_QUEUE MWQ, QUEUE Q
WHERE U.ID = MUW.WORKGROUP2USER
AND W.ID = MUW.USER2WORKGROUP
AND W.ID = MWQ.QUEUE2WORKGROUP
AND Q.ID = MWQ.WORKGROUP2QUEUE
AND U.LOGIN = 'johndoe'

当所有实体都有现有值时,此查询可以正常工作,但我们假设用户只有一个工作组,并且该工作组没有任何队列。工作组的ID不会存在于表M2M_WG_QUEUE(MWQ)中,因此查询不会显示结果。

我想要的是看到用户及其工作组,即使其中一些人没有队列。像这样:

USER      WORKGROUP    QUEUE
johndoe   WG3          Q7
johndoe   WG3          Q8
johndoe   WG4          Q7
johndoe   WG9

在上面的例子中,结果应该是这样的:

USER      WORKGROUP    QUEUE
johndoe   WG6

我该怎么做?我认为也许可以通过加入或(+)来完成,但我已经尝试过几种方式而不是它们有效...

1 个答案:

答案 0 :(得分:1)

从不FROM子句中使用逗号。 始终使用正确,明确,标准的JOIN语法。临

您的问题是您需要LEFT JOIN,大概是:

SELECT U.LOGIN, WG.WORKGROUP, Q.QUEUE
FROM USER U LEFT JOIN
     M2M_USER_WG MUW
     ON U.ID = MUW.WORKGROUP2USER LEFT JOIN
     WORKGROUP W
     ON W.ID = MUW.USER2WORKGROUP LEFT JOIN
     M2M_WG_QUEUE MWQ
     ON W.ID = MWQ.QUEUE2WORKGROUP LEFT JOIN
     QUEUE Q
     ON Q.ID = MWQ.WORKGROUP2QUEUE
WHERE U.LOGIN = 'johndoe';