2017-04-26 35 views
0

考虑,下表:如何使用外连接找到未使用的记录?

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

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

我希望以下结果:

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

你将如何做到这一点使用外连接?

+0

尝试使用Google搜索问题标题。 – philipxy

回答

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.idclasses.room不匹配,因为后者为空,仍会返回rooms列。注意classes.name也是空的,因为记录不匹配。我知道这对初学者来说有点混乱。 (像我一样,我只是想分享我的经验,对不起听起来有点困惑)

所以你可以看到,所有需要从这里完成的是过滤出classes,其中room为空。

+--------------+ 
| UNUSED ROOMS | 
+==============+ 
| id   | 
+--------------+ 
| A1.02  | 
+--------------+ 
相关问题