yo,
für einen sql anfänger ist diese query aber schon relativ "hart". zum anderen konnte ich unter deinen link die besagte query nicht finden. ausserdem ist die query so sehr, sehr langsam. nicht alles sollte man immer in eine abfrage packen. des weiteren habe ich die query mal auf der besagten seite abgeschickt und bekam sehr merkwürdige ergebnisse. daraufhin habe ich mal die where bedingung an die richtige stelle gesetzt und das sah schon besser aus und ging auch viel schneller.
ich denke mal, man kann die query auch einfacher gestalten, gerade bei dem dbms was benutzt wird. dazu wäre es aber gut, das datenbank-design zu kennen. ok genug geschwafel....
in prinzip passiert folgendes. du hast drei abfragen, die in einander verschachtelt sind. die erste abfrage verknüpft die länder tabelle (country) mit der städte tabelle (city). dabei wird ein einfacher inner join in der where klausel benutzt. diese join bedingung stand bei dir an der falsche stelle. sie gehört zum äußeren, sprich ersten SELECT. so weit nichts dramatisches.
was die sache komplizierter macht, ist die angabe einer zusätzlicher spalte im äußeren select und zwar soll da die summe des umlandes ausgegeben werden, was das auch immer heißen mag. dabei wird eine sogenannte aggregat-funktion benutzt, die immer nur einen werte pro gruppe zurück liefert. in prinzip sollte man hier mal über einen GROUP BY nachdenken, das wäre meiner meinung nach die elegantere methode. aber warum einfach, wenn es auch kompliziert geht.
um nun nicht nur eine gesamtsumme herauszubekommen, sondern pro datensatz eine entsprechende summe, setzt er an der besagten spalte einen unterabfrage, die ihrerseits noch mal eine unterabfrage besitzt und zwar nicht als spalte sondern in diesem falle als tabelle. diese fiktive tabelle beinhaltet alle datensätze der umgebung einer hauptstadt und schließt die population der haupstadt aus, aus der schließlich die summe gebildet wird und als spalte in der ersten, äußeren abfrage wieder erscheint.
SELECT Country.Name,Country.Capital,City.Population,
(SELECT SUM(Umland.Summe)
FROM (SELECT City.Population Summe
FROM City,Country C1
WHERE City.Country=C1.Code AND City.Name !=C1.Capital
) Umland
)
FROM City,Country
WHERE City.Name=Country.Capital AND City.Country = Country.Code
Ilja