如何使用外部联接查找未使用的记录?

How do I find unused records using an outer join?

鉴于以下表格:

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

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

我希望得到以下结果:

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

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

以下查询完全符合要求:

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         |
+-------------+--------------+---------------+

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

如您所见,从这里开始需要做的就是过滤掉 classes,其中 room 为空。

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