如何使用外部联接查找未使用的记录?
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.id
与 classes.room
不匹配,因为后者为空,rooms
列仍将返回。请注意 classes.name
也是空的,因为记录不匹配。我知道这对初学者来说有点混乱。 (和我一样,我只是想分享我的经验。抱歉听起来有点困惑。)
如您所见,从这里开始需要做的就是过滤掉 classes
,其中 room
为空。
+--------------+
| UNUSED ROOMS |
+==============+
| id |
+--------------+
| A1.02 |
+--------------+
鉴于以下表格:
+--------------+
| 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.id
与 classes.room
不匹配,因为后者为空,rooms
列仍将返回。请注意 classes.name
也是空的,因为记录不匹配。我知道这对初学者来说有点混乱。 (和我一样,我只是想分享我的经验。抱歉听起来有点困惑。)
如您所见,从这里开始需要做的就是过滤掉 classes
,其中 room
为空。
+--------------+
| UNUSED ROOMS |
+==============+
| id |
+--------------+
| A1.02 |
+--------------+