3个表上的SQL查询

时间:2012-12-03 19:59:28

标签: sql

我有三张桌子:

星系,太阳系和行星。

所有这些都以Id显而易见的方式连接(星系可能有xx太阳系,SS可以有xx行星)。假设他们有这样的结构:

    Galaxy: id, name
    Solar System: id, id_galaxy, name
    Planet: id, id_solar_system, name

我真的很难创建一个查询来执行以下操作:

选择根本没有行星的星系名称。 (他们仍然可以拥有空的太阳系)。

请忽略这样一个事实,即某些事情在科学方面看似不太可能;)

我认为它必须是左外连接的东西,我可以很容易地选择没有任何行星的太阳系,但我似乎很难将它“传播”到星系。我想我需要一些更复杂的查询,也许是一个子查询。)

请帮助,我真的很感激!

2 个答案:

答案 0 :(得分:3)

您需要having子句:

SELECT G.id, G.name
FROM Galaxy G LEFT OUTER JOIN
     SolarSystem SS
     ON G.id = SS.id_galaxy LEFT OUTER JOIN
     Planet P
     ON SS.id = P.id_solar_system
group by g_id, g.name
having max(P.id) IS NULL

left outer join将所有行星和太阳系聚集在一起。 having子句选择在galazy中根本没有行星的那个。

答案 1 :(得分:3)

我发现使用not exists对这类问题最具可读性:

select name
from galaxy g
where not exists( select * 
                  from solarsystem s join planet p on s.id=p.id_solar_system
                  where id_galaxy=g.id )