2016-07-05 34 views
1

假设我有3个表:SQL:如何连接表的权利?

CREATE TABLE animals 
(
    animal_id INT PRIMARY KEY, 
    animal_name VARCHAR(100) 
); 

CREATE TABLE zoos 
(
    zoo_id INT PRIMARY KEY, 
    zoo_name VARCHAR(100) 
); 

CREATE TABLE zoo_has_animals 
(
    zoo_id INT, 
    animal_id INT 
); 

我需要得到所有空动物园。我尝试使用下一个脚本加入它们:

SELECT zoos.zoo_name 
FROM zoos 
LEFT JOIN zoo_has_animals ON zoos.zoo_id = zoo_has_animals.zoo_id; 

但它返回所有不是空的动物园而不是所需的空动物园。我究竟做错了什么?

+0

哪个RDBMS是这个呢?请添加一个标签来指定您是使用'mysql','postgresql','sql-server','oracle'还是'db2' - 或者其他的东西。 –

+0

你想要一个OUTER LEFT JOIN。我总是参考[此图](http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg),希望它有帮助。 – Aaron

+0

@marc_s这是'MySQL'。 – Alex

回答

1

无需为JOIN都:

SELECT z.zoo_name 
FROM zoos as z 
WHERE NOT EXISTS(SELECT 1 FROM zoo_has_animals 
       WHERE zoo_id = z.zoo_id); 

随着JOIN

SELECT z.zoo_name 
FROM zoos as z 
LEFT JOIN zoo_has_animals as h 
    ON z.zoo_id = h.zoo_id 
WHERE h.zoo_id IS NULL; 
+0

我明白了,但是可以通过JOIN做到吗? – Alex

+0

@Alex当然,并且回答了评论。无论如何,更新我的答案与它的一个版本 – Lamak