我认为这个问题之前可能已经得到了回答,但是我无法找到它:我发现的所有结果都不能解决这个问题......
假设我的数据库有以下表格和关系(我无法改变它们):
我有这样的查询:
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
我该怎么做?我认为也许可以通过加入或(+)来完成,但我已经尝试过几种方式而不是它们有效...
答案 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';