【问题标题】:SQL: How to join tables right?SQL:如何正确连接表?
【发布时间】: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?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或其他完全不同的东西。
  • 你想要一个 OUTER LEFT JOIN。我总是参考this diagram,希望对您有所帮助。
  • @marc_s 这是给MySQL的。
  • 无论您使用什么平台,都可以查找IS NULL 的概念。
  • @Aaron 他已经在使用LEFT JOIN...

标签: mysql


【解决方案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 上给出的。无论如何,用它的一个版本更新了我的答案
猜你喜欢
  • 2011-08-25
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多