SQL Anfrage mit MINUS oder Exists?

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

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

    Quellcode

    1. (SELECT Country.Name
    2. FROM Country INNER JOIN City ON City.Country = Country.Code
    3. WHERE Country.Capital = City.Name AND City.Population < 500000)
    4. MINUS
    5. (SELECT Country.Name
    6. FROM Country INNER JOIN City ON City.Country = Country.Code
    7. GROUP BY Country.Name
    8. 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?

    Quellcode

    1. SELECT Country.Name
    2. FROM Country
    3. WHERE EXISTS (
    4. SELECT *
    5. FROM City
    6. WHERE Country.Capital = City.Name AND City.Population < 500000
    7. )
    8. GROUP BY Country.Name
    9. 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?
  • 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.
  • 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!