Martin Grünkern: SELECT umkehren

Hallo Forum,

ich habe zwei Tabellen:
JOB und PERSON

Diese beiden Tabellen sind verknüpft mit:
job_person_id=person_id

Die Vereinsmitglieder sind in der Tabelle
PERSON gespeichert.

Wenn ein Vereinsmitglied eine Arbeit macht,
wird dies in der Tabelle JOB gespeicht.

Nun brauche ich ein SELECT der mir alle Personen listet,
die in einem bestimmten Zeitraum nicht gearbeitet haben.

Ich habe folgenden Ansatz:
SELECT job_id, person_name, job_datum FROM job, person WHERE job_person_id=person_id AND job_datum BETWEEN '2005-04-01' AND '2005-04-30'

Der SELECT zeigt mir alle Personen an, die gearbeitet haben.
Wie kann ich diesen SELECT umdrehen, damit ich alle Personen aufgelistet bekomme, die nicht gearbeitet haben.

  1. Hallo!

    Wie kann ich diesen SELECT umdrehen, damit ich alle Personen aufgelistet bekomme, die nicht gearbeitet haben.

    Das sollte mit einem LEFT JOIN gehen. Siehe dazu in der Doku.

    André Laugks

    --
    Die Frau geht, die Hilti bleibt!
    1. Das sollte mit einem LEFT JOIN gehen. Siehe dazu in der Doku.

      Hi,

      DANKE
      als Anfänger ist dies nicht so leicht. Kann mir bitte jemand dies etwas genauer zeigen.

      1. Das sollte mit einem LEFT JOIN gehen. Siehe dazu in der Doku.

        Hi,

        DANKE
        als Anfänger ist dies nicht so leicht. Kann mir bitte jemand dies etwas genauer zeigen.

        1. eine datenbank liefert prinzipiell nur das, was in ihr enthalten ist. was nicht vorhanden ist, kann auch nicht selectiert werden.

        2. die beiden tabellen müssen über einen join mit verknüpfungsspalte verbunden werden, damit zwischen diesen eine relation besteht. SELECT ... FROM table1 JOIN table2 USING(id)

        3. es gibt aber doch einen trick, die nicht existenten verknüpfungen zu bekommen. hierzu wird die eine tabelle voll gelesen. hat die andere tabelle keinen eintrag, wird ein NULL geliefert. diesen kann man in seine abfrage einbauen. dann erhält man alle zeilen der ersten tabelle, welche in der 2. tabelle keine relationen haben.
        ungefähr so:

        SELECT .... FROM t1 LEFT JOIN t2 ON (t1.id = t2.id) WHERE t2.id IS NULL)

        1. Hi,

          DANKE für den Tip.
          Ich habe jetzt folgendes:

          SELECT person_id, person_vorname, person_nachname, job_datum
          FROM person
          LEFT JOIN job ON ( person_id = job_person_id )
          WHERE job_id IS NULL

          Und wie kann ich das Ergebnis auf ein Datum begrenzen?

          SELECT person_id, person_vorname, person_nachname, job_datum
          FROM person
          LEFT JOIN job ON ( person_id = job_person_id )
          WHERE job_id IS NULL AND job_datum='2005-03-16'

          geht leider nicht ;-(

          1. Hallo,

            Und wie kann ich das Ergebnis auf ein Datum begrenzen?

            SELECT person_id, person_vorname, person_nachname, job_datum
            FROM person
            LEFT JOIN job ON ( person_id = job_person_id )
            WHERE job_id IS NULL AND job_datum='2005-03-16'

            Der LEFT JOIN mit WHERE job_id IS NULL bringt Dir alle die Datensätze aus der Tabelle person, für die es in der Tabelle job noch keine Einträge gibt, für die gelten würde: person_id = job_person_id. Das ergibt alle Personen, für die es _überhaupt_ noch keine Jobs gibt. Das heißt doch aber sicher auch, dass es dann auch noch kein job_datum gibt, oder? Wenn job_datum aber NULL ist, kann es nich gleichzeitig '2005-03-16' sein.

            Wenn Du wissen willst, für welche Personen es am '2005-03-16' noch keine Jobs gibt, dann musst Du fragen, ob im JOIN job_id NULL ist (es gibt überhaupt noch keine Jobs für diese Person) ODER, wenn es Jobs gibt, diese _nicht_ am '2005-03-16' sind.

            SELECT person_id, person_vorname, person_nachname, job_datum
            FROM person
            LEFT JOIN job ON ( person_id = job_person_id )
            WHERE job_id IS NULL OR job_datum <> '2005-03-16'

            viele Grüße

            Axel