You are not logged in.

  • Login

1

Friday, May 13th 2011, 7:17pm

SQL Anfrage mit MINUS oder Exists?

Hallo,

ich hab mal ne Frage. Ich hab eine funktionierende SQL Anfrage mit MINUS erstellt die mir alle Länder gibt wo die Hauptstadt weniger als 500.000 Einwohner hat und das Land mehr als 5 Städte enthält.

SQL Code

1
2
3
4
5
6
7
8
9
10
(SELECT Country.Name
FROM Country INNER JOIN City ON City.Country = Country.Code
WHERE Country.Capital = City.Name AND City.Population < 500000)
 
MINUS
 
(SELECT Country.Name
FROM Country INNER JOIN City ON City.Country = Country.Code
GROUP BY Country.Name
HAVING COUNT(City.Name) > 5);


Jetzt bin ich in paar Folien nochmal auf EXISTS gestoßen was ja eine Unterabfrage realisiert. Leider habe ich es noch nicht ganz hinbekommen, wie das erfolgt und da wollte ich zuerst mal fragen wie ich das HAVING COUNT am besten realisiere?

SQL Code

1
2
3
4
5
6
7
8
9
SELECT Country.Name
FROM Country
WHERE EXISTS (
  SELECT *
  FROM City
  WHERE Country.Capital = City.Name AND City.Population < 500000
  )
GROUP BY Country.Name
HAVING COUNT(City.Name) > 5;


Und dann habe ich mir überlegt das die Abfrage mit MINUS ja besser für die Laufzeit ist da nicht für jeden Eintrag nochmal eine Unterabfrage gemacht werden muss. Stimmt das oder ist die Laufzeit da nicht sehr unterschiedlich?

2

Saturday, May 14th 2011, 3:51pm

Sind deine beiden wirklich äquivalent?
Wenn du nur das haben willst, was in beiden Listen ist, brauchst du statt dem MINUS ein INTERSECT

MINUS ist soweit ich weiß kein SQL'92er Standard und funktioniert nur in wenigen DBMS. (im weit verbreiteten MySQL gibt es das z.B. nicht)
WHERE EXISTS hingegen ist tierisch langsam.

Falls ihr mit SQL'92 Standard programmieren sollt und du MINUS erreichen willst, dann machs mit einem LEFT JOIN und einem WHERE ISNULL(righttable.column)

Falls ihr ein INTERSECT haben wollt, dann einfach ein INNER JOIN.

3

Saturday, May 14th 2011, 4:36pm

Also die Anfrage mit MINUS funktioniert aber das mit INTERSECT trifft es doch eher, also war das Ergebnis dann falsch - danke schonmal dafür ;)!

Das WHERE EXISTS langsam ist dachte ich mir, also vergess ich lieber das ganz schnell!

Wir benutzen zwar Oracle aber ich schau nochmal ob ich das auch mit INNER JOIN hinkriege!

Sollte man sich eigentlich für eine spezielle Standardisierung spezialisieren oder immer versuchen das meißte rauszuholen was die Datenbank unterstützt? Ist SQL 92 am verbreitetsten?

Danke!

4

Saturday, May 14th 2011, 6:38pm

naja, wenn du dir 200 % sicher bist, dass dein Projekt nur auf einem DBMS laufen soll, dann nutze alle verfügbaren Methoden.
Der SQL'92 Standard ist das was alle mir bekannten DBMS Projekte unterstützen.
Lg

Similar threads

Social bookmarks