You are not logged in.

  • Login

1

Saturday, April 30th 2011, 11:51am

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

PL/SQL Code

1
2
SELECT City.Name, Country.Name
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?

2

Saturday, April 30th 2011, 1:25pm

ich kann kein COUNT in der WHERE Klause benutzen

Im Gegensatz zur Having-Klausel wird das Kriterium der Where-Klausel angewendet, bevor die Zeilen zu Gruppen zusammengefasst werden. Daher ist diese Kombination auch wenig sinnvoll und du solltest ersteres verwenden. ;)

3

Saturday, April 30th 2011, 1:59pm

Ich hab jetzt eine funktionierende SQL Abfrage aber irgendwie bekomme ich glaube ich das falsche Ergebnis:

PL/SQL Code

1
2
3
4
5
SELECT City.Name, Country.Name
FROM City INNER JOIN Country ON City.Country = Country.Code
GROUP BY City.Name, Country.Name
HAVING COUNT(*) > 1
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?

4

Saturday, April 30th 2011, 3:20pm

Müssen deine GROUP Argumente nicht in anderer Reihenfolge sein?

5

Saturday, April 30th 2011, 3:29pm

Müssen deine GROUP Argumente nicht in anderer Reihenfolge sein?


Da kommt das selbe Ergebnis raus :(.

6

Saturday, April 30th 2011, 4:44pm

Achso, jetzt verstehe ich es erst.
Wenn es Berlin 1x in Deutschland und 1x den USA gibt, dann willst du haben

Quoted

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

Quoted

Berlin DE,USA


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

SQL Code

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

7

Saturday, April 30th 2011, 6:25pm

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:

SQL Code

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


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

This post has been edited 1 times, last edit by "Illidan" (Apr 30th 2011, 6:54pm)


8

Sunday, May 1st 2011, 11:46am

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.

SQL Code

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

9

Sunday, May 1st 2011, 12:32pm

Okay, noch besser - danke!

Sollte man LIKE so gut wie möglichst vermeiden außer man will wirklich Werte filtern wo Platzhalter drin sind? Ich hab irgendwie in der letzten Vorlesung oder so mitbekommen das man "=" eher für Zahlen benutzt und LIKE für Text.

10

Sunday, May 1st 2011, 1:26pm

Davon habe ich noch nie etwas gehört. Macht auch eigentlich keinen Sinn ;)
Like benutze ich nur in Kombinatin mit %. Und das auch am Besten nur am Ende des Ausdrucks, damit der Binärbaum des Index so weit wie möglich genutzt werden kann.

Similar threads

Social bookmarks