SQL:如何正确连接表?
Posted
技术标签:
【中文标题】SQL:如何正确连接表?【英文标题】:SQL: How to join tables right? 【发布时间】:2016-07-05 15:53:11 【问题描述】:假设我有 3 张桌子:
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;
但它返回所有非空动物园而不是所需的空动物园。我做错了什么?
【问题讨论】:
这适用于哪个 RDBMS?请添加标签以指定您使用的是mysql
、postgresql
、sql-server
、oracle
还是db2
- 或其他完全不同的东西。
你想要一个 OUTER LEFT JOIN。我总是参考this diagram,希望对您有所帮助。
@marc_s 这是给MySQL
的。
无论您使用什么平台,都可以查找IS NULL
的概念。
@Aaron 他已经在使用LEFT JOIN
...
【参考方案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;
【讨论】:
我明白了,但是可以通过 JOIN 来做到这一点吗? @Alex 当然,答案是在 cmets 上给出的。无论如何,用它的一个版本更新了我的答案以上是关于SQL:如何正确连接表?的主要内容,如果未能解决你的问题,请参考以下文章
从表内连接中删除 - ORA-00933:SQL 命令未正确结束