【发布时间】:2018-11-04 17:41:16
【问题描述】:
我认为这个问题之前可能已经回答过,但我找不到:我找到的所有结果都不是这个问题的解决方案......
假设我的数据库有以下表和关系(我无法更改它们):
- 实体:用户、工作组和队列
- 一个用户可以包含在多个工作组中,一个工作组可以有多个用户。
- 一个工作组可以有多个队列,一个队列可以属于多个工作组。
- 有两个表构成这些“多对多”关系: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
我该怎么做?我认为它可能可以通过加入或 (+) 来完成,但我已经尝试了多种方式,但都没有奏效......
【问题讨论】:
-
您正在使用内部联接(好吧,实际上是交叉联接,您的
WHERE子句变成了内部联接,因为您使用的是我们在 1980 年代使用的过时的联接语法),您只得到匹配。您需要一个外连接,即使连接的表没有匹配项,您也可以在其中保留一行。在您的手册中查找连接(尤其是INNER JOIN和LEFT OUTER JOIN)。顺便说一句:始终使用您正在使用的 DBMS(MySQL、Oracle、SQL Server 等)标记 SQL 问题。
标签: sql oracle select join many-to-many