Sandra: SQL Verschachtelung-Verständnisfrage

Hallo liebes Forum.
Ich bin ein SQL-Anfänger und kämpfe gerade mit den Aufgaben meines Dozenten.
Eine grundlegende Sache an SQl-Querrys ist mir bisher aber noch nicht klar geworden. Vielleicht kann mir ja jemand weiterhelfen.
Zum Beispiel bei folgender Anfrage, die ihr unter http://dbpraktikum.ifi.informatik.uni-goettingen.de/sql.php nachvollziehen könnt.

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 //Hier gehört die genauere Bedinung hin,ob die Stadt eine bestimmte Entfernung zur Hauptstadt nicht überschreitet
             ) Umland
  WHERE City.Name=Country.Capital AND City.Country = Country.Code)
FROM City,Country

Die Abfrage soll zu jedem Land auch die Einwohner ausgeben, die in einem bestimmten Umkreis um die Hauptstadt wohnen. Die Where-Bedinung dafür soll jetzt keine Rolle spielen.
Mir ist es jetzt aber nicht klar, welche Tabellen in der innersten FROM und in der äußersten FROM in Beziehung stehen.
Ist es überhaupt sinnvoll, in verschachtelten SELECTS mehrmals auf genau die gleichen Tabellen zuzugreifen?
Wenn ja, in welche Richtung muss das gelesen werden?  Ich stehe da irgendwie auf dem Schlauch...
Ich hoffe ihr versteht, was ich meine.
Vielen Dank schon einmal im Voraus!

Gruß
Sandra

  1. Nach meinem Verstaendnis duerfte diese Abfrage nicht laufen.

    1. Tut sie leider auch nicht. Mir ist aber nicht klar, warum sie dies nicht tut. Kannst Du mir das erklären?

  2. 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

    1. Vielen Dank Ilja. Das hat meinem Verständnis schon sehr geholfen. Warum die Dozenten aber auch immer glauben, gleich als 5. oder 6. Abfrage solche schwierigen einzubauen...

    2. Hi,

      ich habe mir heute nacht(!) auch fuer eine Stunde an der Fragestellung die Zaehne etwas ausgebissen. (Habe mich aber entschieden nichts zu schreiben.  ;-)

      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

      Angefordert war eine Abfrage, die den Laendernamen, die Landeshauptstadt, dessen Population und die Restpopulation (ich schreibe Restpopulation, weil eine weitere eigrenzende Bedingung fehlt) des Landes anzeigt.

      Der Resultset der o.g. Anfrage ist hier abzuholen http://dbpraktikum.ifi.informatik.uni-goettingen.de/sql.php.

      (Das Schema ist da auch rigendwo verfuegbar:9

      Fuer den vierten abgefragten Wert "(SELECT..." lautet das Ergebnis allerdings immer "889611955".

      Moeglicherweise stimmt da was nicht?

      Gruss,
      Ludger

      PS: Zumindest fuer mich ganz schoen komplex das Ding, so dass ich schrittweise vorgehen wuerde. Die urspruengliche gelieferte Query taugt uebrigens gar nichts, oder?

      --
      "Ist der Hund gesund freut sich der Mensch"
      1. yo,

        ich habe mir heute nacht(!) auch fuer eine Stunde an der Fragestellung die Zaehne etwas ausgebissen.

        nun ja, es soll mittlerweile schon sehr gute dritte geben. besser als immer nur suppe zu löffeln....

        Fuer den vierten abgefragten Wert "(SELECT..." lautet das Ergebnis allerdings immer "889611955".

        Moeglicherweise stimmt da was nicht?

        die bedingung, welche städte zum umfeld gehören fehlt, bzw. ist nur als kommentar angegeben. insofern nimmt die query, so wie sie ist, immer alle städte mit rein. deswegen das gleiche ergebnis in der vierten spalte. ich kann dieses bedingung leider nicht ergänzen. kommt halt auch darauf an, was noch umfeld ist und was nicht.

        PS: Zumindest fuer mich ganz schoen komplex das Ding, so dass ich schrittweise vorgehen wuerde. Die urspruengliche gelieferte Query taugt uebrigens gar nichts, oder?

        ich würde das problem auch anders angehen und mit group by arbeiten. die ursrüngliche query ist schon ok, nur die where bedingung für den inner join war an der falschen stelle.

        Ilja

        1. Hi,

          Moeglicherweise stimmt da was nicht?

          die bedingung, welche städte zum umfeld gehören fehlt, bzw. ist nur als kommentar angegeben. insofern nimmt die query, so wie sie ist, immer alle städte mit rein. deswegen das gleiche ergebnis in der vierten spalte. ich kann dieses bedingung leider nicht ergänzen. kommt halt auch darauf an, was noch umfeld ist und was nicht.

          doch, Du koenntest die Bedingung ergaenzen: die Summe aller Stadpopulationen (ausser Hauptstadtpopulation) des Landes

          Und? Wie wuerde das SQL-Statement dann aussehen?

          Gruss,
          Ludger

          1. yo,

            doch, Du koenntest die Bedingung ergaenzen: die Summe aller Stadpopulationen (ausser Hauptstadtpopulation) des Landes

            es soll die population alle städte der näheren umgebung einer jeweiligen hauptstadt summiert werden und nicht alle städte. woher soll ich den wissen, welchen bedingungen es zu einer stadt in der näheren umgebung machen, bzw. welche nicht ?

            Ilja

            1. Hi,

              es soll die population alle städte der näheren umgebung einer jeweiligen hauptstadt summiert werden und nicht alle städte. woher soll ich den wissen, welchen bedingungen es zu einer stadt in der näheren umgebung machen, bzw. welche nicht ?

              indem Du die naehere Umgebung einer Hauptstadt eines Landes so definierst, dass alle Staedte des betreffenden Landes ausser der Hauptstadt des betreffenden Landes ihr angehoeren. Die "Umgebungspopulation" also mit der Formel "Landespopulation - Hauptstadtpopulation" zu ermitteln ist.

              Diese Bedingung inkludierend koenntest Du dann auch ein noch hilfreicheres SQL-Statement bereitstellen?

              Gruss,
              Ludger

              --
              "Wer nicht kaempft, hat schon gewonnen."
              1. yo,

                indem Du die naehere Umgebung einer Hauptstadt eines Landes so definierst, dass alle Staedte des betreffenden Landes ausser der Hauptstadt des betreffenden Landes ihr angehoeren.

                das wäre sicherlich eine möglichkeit, ABER ich befürchte, dass ist damit nicht gemeint, weil eine stadt sicherlich einem anderen land angehröen kann und doch nur wenige kilometer entfernt ist. im gegensatz dazu könnte eine andere stadt im gleichen land sein aber viel weiter weg. was also genau die nährere umgebung bedeutet, ist mehr oder weniger spekulationssache, bis uns der liebe professor sagt, was er damit meint, bzw. die bedingungen dafür bereit stellt.

                Diese Bedingung inkludierend koenntest Du dann auch ein noch hilfreicheres SQL-Statement bereitstellen?

                ja, das würde gehen. aber meine freundin (die pflicht ?!) ruft und ich muss spurten. insofern muss das ein wenig warten oder jemand anderes ergäntzt die query. ;-)

                Ilja

                1. Hi,

                  es gab allerdings schon im Ausgangsposting deutliche Hinweise, was die Query leisten soll:

                  City.Name != C1.Capital //Hier gehört die genauere Bedinung hin,ob die Stadt eine bestimmte Entfernung zur

                  ) Umland

                  Du kannst ja gerne spaeter mal das vermutlich angeforderte SQL-Statement hier bereitstellen.

                  Gruss,
                  Ludger

                  --
                  "Wer nicht kaempft, hat schon gewonnen."
                  1. Entschuldigt bitte die Verwirrung, die ich verursacht habe.
                    Die Bedingung, ob die Stadt in der näheren Umgebung liegt, ist folgendermaßen definiert: Ja, wenn der Breitengrad und der Längengrad jeweils maximal 0,1° von der Hauptstadt entfernt sind.

                    1. Hi,

                      Die Bedingung, ob die Stadt in der näheren Umgebung liegt, ist folgendermaßen definiert: Ja, wenn der Breitengrad und der Längengrad jeweils maximal 0,1° von der Hauptstadt entfernt sind.

                      schoen - und wie lautet nun das SQL-Statement, das die erwuenschte Matrix liefert?

                      Gruss,
                      Ludger

                      --
                      "Die SPD im Aufwind?"
                      1. Vielleicht so?

                        SELECT City.Population
                            FROM City,Country C1
                            WHERE City.Country=C1.Code AND City.Name != C1.Capital
                                   AND City.longitude - (SELECT City.longitude
                                    FROM City, Country
                                    WHERE City.Name=Country.Capital AND City.Country=Country.Code AND C1.Code=Country.Code
                                    ) <= 0.1
                                   AND City.longitude - (SELECT City.longitude
                                    FROM City, Country
                                    WHERE City.Name=Country.Capital AND City.Country=Country.Code AND C1.Code=Country.Code
                                    ) >= -0.1
                            AND City.latitude - (SELECT City.latitude
                             FROM City, Country
                             WHERE City.Name=Country.Capital AND City.Country=Country.Code AND C1.Code=Country.Code
                             ) >= -0.1
                            AND City.latitude - (SELECT City.latitude
                             FROM City, Country
                             WHERE City.Name=Country.Capital AND City.Country=Country.Code AND C1.Code=Country.Code
                            ) >= -0.1)

                        1. Hi,

                          Vielleicht so?

                          na, ist das Resultset denn auch wie erwartet?

                          Gruss,
                          Ludger

                          --
                          "Sag niemals vielleicht!"
                          1. Das muss ich jetzt erstmal mit den Korrekturvorschlägen kombinieren. Komme gerade erst von der Fh...:(

                            1. Ich habe den Query jetzt folgendermaßen zusammengesetzt:
                              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
                                        AND City.longitude - (SELECT City.longitude
                                          FROM City, Country
                                          WHERE City.Name=Country.Capital AND City.Country=Country.Code AND C1.Code=Country.Code
                                          ) <= 0.1
                                         AND City.longitude - (SELECT City.longitude
                                          FROM City, Country
                                          WHERE City.Name=Country.Capital AND City.Country=Country.Code AND C1.Code=Country.Code
                                          ) >= -0.1
                                  AND City.latitude - (SELECT City.latitude
                                   FROM City, Country
                                   WHERE City.Name=Country.Capital AND City.Country=Country.Code AND C1.Code=Country.Code
                                   ) >= -0.1
                                  AND City.latitude - (SELECT City.latitude
                                   FROM City, Country
                                   WHERE City.Name=Country.Capital AND City.Country=Country.Code AND C1.Code=Country.Code
                                  ) >= -0.1)  Umland
                                    )
                              FROM City,Country
                              WHERE City.Name=Country.Capital AND City.Country = Country.Code

                              Leider wird die Summe pro Stadt noch nicht richtig berechnet. (Siehe bei http://dbpraktikum.ifi.informatik.uni-goettingen.de/sql.php)
                              Kann mir jemand sagen, welcher Fehler da noch nicht behoben ist?

                              Vielen Dank!