2017-04-26 36 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  | 
+--------------+ 
相關問題