我有三张桌子:
星系,太阳系和行星。
所有这些都以Id显而易见的方式连接(星系可能有xx太阳系,SS可以有xx行星)。假设他们有这样的结构:
Galaxy: id, name
Solar System: id, id_galaxy, name
Planet: id, id_solar_system, name
我真的很难创建一个查询来执行以下操作:
选择根本没有行星的星系名称。 (他们仍然可以拥有空的太阳系)。
请忽略这样一个事实,即某些事情在科学方面看似不太可能;)
我认为它必须是左外连接的东西,我可以很容易地选择没有任何行星的太阳系,但我似乎很难将它“传播”到星系。我想我需要一些更复杂的查询,也许是一个子查询。)
请帮助,我真的很感激!
答案 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 )