首页 > 解决方案 > SQL - 从多个表中选择,其中一个没有结果

问题描述

我想这个问题之前可能已经回答过,但是我找不到:我找到的所有结果都不是这个问题的解决方案......

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

我有一个这样的查询:

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

我怎样才能做到这一点?我认为它可能可以通过加入或 (+) 来完成,但我已经尝试了多种方式,但没有一个有效......

标签: sqloracleselectjoinmany-to-many

解决方案


切勿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';

推荐阅读