2

我有三张桌子:

星系、太阳系和行星。

它们都以明显的方式通过 Id 连接(星系可能有 xx 个太阳系,SS 可以有 xx 个行星)。假设他们有这样的结构:

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

我真的在努力创建一个查询来执行以下操作:

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

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

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

请帮忙,我真的很感激!

4

2 回答 2

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

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

于 2012-12-03T20:13:39.067 回答
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 )
于 2012-12-03T20:21:28.960 回答