我们正在进行编程练习:SQL with Sailor Moon.。
我们正在尝试连接三个表。
首先,我们尝试通过ID加入:
select senshi_name as sailor_senshi, real_name_jpn as real_name, cats.name
from sailorsenshi
INNER JOIN cats ON (cats.id = sailorsenshi.cat_id)
INNER JOIN schools ON (schools.id = sailorsenshi.school_id);
我们看到执行此查询后的结果是:
sailor_senshi real_name name
Sailor Moon Usagi Tsukino Luna
Sailor Mercury Ami Mizuno Luna
Sailor Mars Rei Hino Luna
Sailor Jupiter Makoto Kino Luna
Sailor Venus Minako Aino Artemis
此结果是错误的,因为我们应该得到10行,而我们有5行。
我们认为先前的结果是由于某些cats_id为空:
select * from sailorsenshi;
然后我们阅读以下主题:SQL Inner Join On Null Values
我们尝试过:
select senshi_name as sailor_senshi, real_name_jpn as real_name, cats.name
from sailorsenshi
INNER JOIN cats ON (cats.id = sailorsenshi.cat_id) OR sailorsenshi.cat_id is null
INNER JOIN schools ON (schools.id = sailorsenshi.school_id);
[我们观察到表salorsenshi中的行与cats表中所有猫的名字都匹配:
select * from cats;
结果是:
id name
1 Luna
2 Artemis
我们如何才能从Sailorsenshi中获得仅重复一次的行?
预期结果是:
我认为您只想要left join
:
select senshi_name as sailor_senshi, real_name_jpn as real_name, cats.name
from sailorsenshi ss LEFT JOIN
cats c
ON c.id = ss.cat_id LEFT JOIN
schools s
ON s.id = ss.school_id;
注意:我为所有表提供了方便的别名。您应该限定查询中的[[all列引用,而不只是ON
子句中的那些。
我将sailorsenshi表用作基本表,然后将内部联接更改为左联接,然后确保sailorsenshi位于联接子句的左侧。另外,我注意到您没有为cat列添加别名,而school列也不存在,因此我在其中添加了它们。
select
senshi_name sailor_senshi
,real_name_jpn real_name
,cats.name cat
,schools.school school
from sailorsenshi
LEFT JOIN
cats ON (sailorsenshi.cat_id = cats.id)
LEFT JOIN schools ON (sailorsenshi.school_id = schools.id);
这应该返回您的预期结果。