sql - SQL - 从多个表中选择,其中一个没有结果
问题描述
我想这个问题之前可能已经回答过,但是我找不到:我找到的所有结果都不是这个问题的解决方案......
假设我的数据库有以下表和关系(我无法更改它们):
- 实体:用户、工作组和队列
- 一个用户可以包含在多个工作组中,一个工作组可以有多个用户。
- 一个工作组可以有多个队列,一个队列可以属于多个工作组。
- 有两个表构成这些“多对多”关系: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
我怎样才能做到这一点?我认为它可能可以通过加入或 (+) 来完成,但我已经尝试了多种方式,但没有一个有效......
解决方案
切勿在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';
推荐阅读
- javascript - “sortItem”计算属性中的意外副作用
- php - 如何在预订系统上只选择可用房间?
- kotlin - 如何正确清理使用 RX 从服务器接收到的项目列表 | 过滤{}地图{}
- haskell - 以格式打印浮点数列表
- android - 使用“buildozer android debug”时出错
- laravel - 如何在提交前检查 v-model 是否为空并显示错误
- python-3.x - 间隔的错误设置输出
- node.js - 如何在节点启动期间主要等待?
- google-cloud-platform - “初始” GCP 云外壳实例的名称是什么?
- javascript - 在给定的不和谐频道中搜索满足条件的所有消息并删除