SQL Abfrage, Identische Städte finden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • SQL Abfrage, Identische Städte finden

    Hallo,

    ich sitze gerade hier an eine Abfrage per SQL und weis irgendwie nicht wirklich wie ich das realisieren soll.

    Das soll jetzt keine Bitte sein meine Aufgaben zu lösen, aber ich habe schon das ganze Internet irgendwie abgesucht über SQL Duplikate und bin öfters wieder auf GROUP BY und HAVING gestoßen aber das realisiert nicht das was ich brauche.

    Und zwar : "Geben Sie alle Städtenamen zusammen mit dem Namen des zugehörigen Landes, die mindestens zweimal in der Datenbank vorkommen, geordnet nach den Städtenamen aus."

    Quellcode

    1. SELECT City.Name, Country.Name
    2. FROM City INNER JOIN Country ON City.Country = Country.Code;


    Das würde mir jetzt alle Städte plus die Ländernamen geben. Aber wie kann ich es so filtern das ich alle Städte bekomme die mindestens zweimal vorkommen aber unterschiedliche Ländernamen haben? Ich denk irgendwie schon das ich mit COUNT zählen muss wie oft die Stadt vorkommt und dann dementsprechend ausgebe aber ich kann kein COUNT in der WHERE Klause benutzen =/.

    Kann mir da vllt. jemand einen Tipp geben?
  • Ich hab jetzt eine funktionierende SQL Abfrage aber irgendwie bekomme ich glaube ich das falsche Ergebnis:

    Quellcode

    1. SELECT City.Name, Country.Name
    2. FROM City INNER JOIN Country ON City.Country = Country.Code
    3. GROUP BY City.Name, Country.Name
    4. HAVING COUNT(*) > 1
    5. ORDER BY City.Name ASC;


    Jetzt bekomme ich ja alle Städte die identischen Namen haben und auch im selben Land liegen? Das sollte ich allerdings auf alle Länder verteilen - muss ich dann nicht irgendwie die Sätze mit den anderen vergleichen?
  • Achso, jetzt verstehe ich es erst.
    Wenn es Berlin 1x in Deutschland und 1x den USA gibt, dann willst du haben
    Berlin DE
    Berlin USA


    Gruppierst du nur nach Stadt, dann entfallen die Informationen DE + USA
    Gruppierst du nach Stadt und Land, dann hast du erst gar keine Dopplungen.

    Ist das eine MySQL Aufgabe oder SQL'92 Standard?

    Bei MySQL gibt es GROUP_CONCAT
    Mit SELECT GROUP_CONCAT(Country.Name) ... GROUP BY City.NAME kannst du folgendes erhalten
    Berlin DE,USA


    Falls du wirklich jedes Land in eigenem Rowset haben willst, geht das meiner Meinung nach nicht ohne Subselect + JOIN

    Quellcode

    1. SELECT City.Name,
    2. Country.Name
    3. FROM (
    4. SELECT City.Name
    5. FROM City
    6. GROUP BY City.Name
    7. HAVING COUNT(City.Name) > 1
    8. ) City
    9. INNER JOIN Country ON City.Country = Country.Code
    10. ORDER BY City.Name ASC
  • Genau, so will ich das haben. Das mit der Gruppierung hat mich auch irgendwie etwas verunsichert, deswegen habe ich immer weiter gesucht ob es da eine Alternative gibt - aber ich denke GROUP BY hilft mir ja dann hier nicht weiter.

    Naja, also GROUP_CONCAT kenn ich aber leider ist ads ne SQL92 Standard Aufgabe, also wir arbeiten mit einer Oracle Datenbank.

    Das es nur mit einer Subquery geht dachte ich mir irgendwie =/. Ich hab auf die schnelle mal versucht das auszuführen aber er kennt kein City.Country (obwohl es auch so heißt). Kann es sein das er das von der Subquery da gar nicht rausbekommt? - EDIT: Es funktioniert zwar, aber die Ausgabe ist wie die vorherige Oo. Es liegt wohl daran da ich City.Country noch in der Subquery bei SELECT und GROUP BY hinzugefügt habe, aber ohen das habe ich das Problem was ich durchgestrichen habe ôo.

    Ich probier noch bisschen weiter damit - schonmal vielen dank für die Hilfe!

    EDIT: Ich hab jetzt bisschen rumprobiert und ich glaube ich habe jetzt eine funktionierende Lösung:

    Quellcode

    1. SELECT City.Name,
    2. Country.Name
    3. FROM (
    4. SELECT City.Name
    5. FROM City
    6. GROUP BY City.Name
    7. HAVING COUNT(City.Name) > 1
    8. ) City, City City2
    9. INNER JOIN Country ON City2.Country = Country.Code
    10. WHERE City.Name LIKE City2.Name
    11. ORDER BY City.Name ASC
    Alles anzeigen


    Bekomm da ca. 115 Einträge raus und so wie das aussieht kann das schon stimmen :) - Vielen Dank!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Illidan ()

  • Stop. Durch die Komma Syntax benutzt hier einen CROSS JOIN dessen Ergebnismenge du mit WHERE versuchst einzuschränken.
    Das ist nicht effizient. Und eine Einschränkung mit LIKE eigentlich auch nicht.

    Quellcode

    1. SELECT City.Name,
    2. Country.Name
    3. FROM (
    4. SELECT City.Name
    5. FROM City
    6. GROUP BY City.Name
    7. HAVING COUNT(City.Name) > 1
    8. ) City
    9. INNER JOIN City City2 ON City2.Name = City.Name
    10. INNER JOIN Country ON City2.Country = Country.Code
    11. ORDER BY City.Name ASC
    Alles anzeigen