【问题标题】:How do I find unused records using an outer join? [duplicate]如何使用外连接查找未使用的记录? [复制]
【发布时间】:2017-04-26 18:23:19
【问题描述】:

给定以下表格:

+--------------+
| CLASSES      |
+==============+
| name | room  |
+------+-------+
| 1A   | A1.01 |
| 1B   | NULL  |
| 1C   | A1.03 |
+------+-------+

+-------+
| ROOMS |
+=======+
| id    |
+-------+
| A1.01 |
| A1.02 |
| A1.03 |
+-------+

我希望得到以下结果:

+--------------+
| UNUSED ROOMS |
+==============+
| id           |
+--------------+
| A1.02        |
+--------------+

您将如何使用外部联接来完成此操作?

【问题讨论】:

  • 尝试用谷歌搜索你的问题标题。

标签: sql join outer-join


【解决方案1】:

以下查询完全符合要求:

SELECT rooms.*
FROM rooms
  LEFT JOIN classes ON rooms.id = classes.room
WHERE
  classes.room IS NULL;

试图解释这里发生了什么:

rooms 上左加入classes 后,您会得到以下结果:

+--------------------------------------------+
| LEFT JOINED                                |
+============================================+
| rooms.id    | classes.name | classes.room  |
+-------------+--------------+---------------+
| A1.01       | 1A           | A1.01         |
| A1.02       | NULL         | NULL          |
| A1.03       | 1C           | A1.03         |
+-------------+--------------+---------------+

由于左连接返回左表的所有条记录(即rooms),即使rooms.id不匹配classes.room,因为后者为空,rooms列仍将返回。请注意classes.name 也是空的,因为记录不匹配。我知道这对初学者来说有点混乱。 (和我一样,我只是想分享我的经验。抱歉听起来有点困惑。)

如您所见,这里需要做的就是过滤掉room 为空的classes

+--------------+
| UNUSED ROOMS |
+==============+
| id           |
+--------------+
| A1.02        |
+--------------+

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多