2

私は3つのテーブルを持っています:

銀河、太陽系、惑星。

それらはすべて 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 に答える