Zwei Namen raussuchen?



  • Hey Leute!

    Ich hab hier eine kleine Übungsdatenbank. In dieser Datenbank gibt es eine Tabelle in der ein Mitarbeiter augeführt ist der am wenigsten und einen Mitarbeiter der am meisten verdient. Nun hab ich hier schon mal einen select-Befehl angewendet, der mir die Person raussucht, die am wenigsten verdient. Die Person die am meisten verdient geht ja analog dazu. Das min() ändert sich dann eben nur in max().

    Hier die zwei Befehle:

    select name from personal where gehalt = (select max(gehalt) from personal))
    

    und

    select name from personal where gehalt = (select max(gehalt) from personal))
    

    Nun möchte ich nun aber einen einzigen Befehl schreiben, der sofort beide Personen, also die Person mit dem wenigsten Gehalt und die Person mit dem meisten Gehalt zugleich ausgibt. Irgendwie aber reicht da grad meine Vorstellungskraft nicht so ganz aus. Ich bin in SQL TOTALER Anfänger. Also erwartet nicht zu viel von mir 🙂 Probiert habe ich es dennoch, nämlich so:

    select name from personal where gehalt = ((select max(gehalt) from personal) and personal.gehalt = (select min(gehalt) from personal))
    

    Das "and" in dem Befehl stelle ich mir hier quasi als "und zugleich" vor. Irgenwie funktioniert das aber nicht. Vielleicht könnt ihr mir helfen?



  • Der Vergleich passiert immer pro Datensatz. In natürlich Sprache würde deine SQL-Anweisung lauten "Liefer mir die Mitarbeiter, die GLEICHZEITIG das kleinste und größte Gehalt bekommt". Deine eigentliche SQL-Anweisung in natürlicher Sprache formuliert wäre also "Liefer mir die Datensätze, die entweder das geringste, oder das höchste Gehalt haben."
    Und das jetzt nur noch als SQL 😉

    mfg
    xXx



  • Zitat: "Liefer mir die Datensätze, die entweder das geringste, oder das höchste Gehalt haben."

    Das "Liefer" is ja wohl das select. Datensätze sind ja dann wohl "name" und wo der Name zu finden ist. Nämlich in "Gehalt". Das Problem ist quasi wie ich das "entweder oder" in SQL ausdrücke.

    Ich probier's nochmal neu:

    select name from personal where gehalt = ((select max(gehalt) from personal) or (select min(gehalt) from personal));
    

    Geht aber auch irgendwie nicht 😞

    Edit: Ich hab gedacht, dass man das "entweder oder" mit "or" ausdrücken könnte...

    Edit2: Was verstehst du unter "Ein Vergleich geschieht immer pro Datensatz"?



  • Nochmal kurz:

    Du schreibst ja ein Vergleich passiert immer pro Datensatz.

    So könnte ich es mir auch vorstellen:

    (select name from personal where gehalt = (max(gehalt) from personal)) or (select name from personal where gehalt = (select min(gehalt) from personal));

    Hab ich auch ausprobiert geht aber genauso wenig. Meine Intention dahinter: Der select-Befehl wird ja hier dann quasi pro Datensatz ausgeführt und mit diesem "or" verknüpft.



  • Du mußt auch bei beiden Sub-Selects angeben, was damit passieren soll. Damit war dein erster Ansatz schon recht nahe am Ziel, außer daß du das "and" durch ein "or" ersetzen müsstest:

    select name from personal
    where
      gehalt = (select max(gehalt) from personal)
     OR
      gehalt = (select min(gehalt) from personal)
    


  • Noch eine kleine weitere Frage:

    Ich möchte mir jetzt aus der Tabelle Personal nur die Beschäftigten ausgeben lassen, die einen Vorgesetzten haben. Die Beschäftigten die keinen Vorgesetzten haben sind mit einem NULL gekennzeichnet. Ich habe mir jetzt gedacht es genügt einen SQL-Befehl zu schreiben, der auf ungleich NULL abfrägt. Das sieht dann bei mir so aus:

    select name from personal where vorgesetzt != NULL;
    

    Aber: Es funktioniert so nicht. Ehrlich gesagt bin ich da jetzt auch wieder etwas aufgeschmissen.

    Wie realisiert man das dann?

    EDIT: Bei Prüfung auf NULL darf man anscheinend keine normalen Vergleichs-Operatoren verwenden. Ich melde mich wieder...



  • select name from personal where NOT (vorgesetzt IS NULL)
    

    evtl. gibts auch

    select name from personal where vorgesetzt NOT IS NULL
    select name from personal where vorgesetzt IS NOT NULL
    

    hängt ein wenig vom SQL-Dialekt ab...

    mfg
    xXx



  • Arbeite mit Join.
    Du brauchst dafür keinen SUBSELECT.

    Weiters kommt es darauf an welches RDBMS du verwendest.

    TSQL ist etwas anders als MySQL.


Log in to reply