具有空ID的内部联接

问题描述 投票:0回答:2

我们正在进行编程练习: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;

enter image description here

然后我们阅读以下主题: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);

enter image description here

[我们观察到表salorsenshi中的行与cats表中所有猫的名字都匹配:

select * from cats;

结果是:

id  name
1   Luna
2   Artemis

我们如何才能从Sailorsenshi中获得仅重复一次的行?

预期结果是:

enter image description here

sql
2个回答
1
投票

我认为您只想要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子句中的那些。


0
投票
这是我想出的。

我将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);

这应该返回您的预期结果。 

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.