SQL-Abfragelogik

Hallo,

Ich habe eine Frage zur Logik einer Implementation für eine SQL-Datenbankabfrage:

Folgende Ausgangssituation: Ich habe ein Programm, das eine Verwaltung von Gruppenmitgliedschaften macht. Dazu gibt es zwei Tabellen: „Sachbearbeiter“ und „Gruppenmitgliedschaften“.

Die Tabellen sehen (verkürzt) so aus:

Felder in „Sachbearbeiter“: NAME, ID
Felder in „Gruppenmitgliedschaften“: GRUPPENID, MITGLIEDID

Die Logik vom Datenmodell her ist also folgende:

Die Tabelle „Gruppenmitgliedschaften“ enthält für jede Mitgliedschaft eines Sachbearbeiters in einer Gruppe einen Record. Zum Beispiel (10, 2) – dann weiss ich, Benutzer Nr. 2 ist Mitglied der Gruppe 10. Ein Sachbearbeiter kann Mitglied mehrerer Gruppen sein.

Provisorisch habe ich mal folgende Logik implementiert:

  • Lesen aller Sachbearbeiter und für jeden einzelnen prüfen ob ein Record in der Gruppenzuweisungstabelle für diesen Sachbearbeiter für die Gruppe X existiert. Wenn ein solcher da ist, weis ich, dass der Benutzer Mitglieder der gesuchten Gruppe ist.

Wir ihr euch sicherlich vorstellen könnt, ist diese Vorgehensweise sehr langsam. Nun gibt es doch sicher eine Möglichkeit dies in einem Schritt zu tun, vieleicht mit einem UNION-Select oder Derartiges.

Ziel wäre eine Abfrage die mir alle alle Benutzer liefert (auch die, die nicht Mitglied der Gruppe X sind, denn diese schreibt das Programm in eine andere Auswahlliste, analog der alten Benutzerverwaltung von Windows NT 4.0). Ich brauche also die Information für jeder einzelne Sachbearbeiter ob dieser Mitglieder der Gruppe ist oder nicht, evtl. durch ein berechnetes Feld.

Da ich leider nicht so der SQL-Spezialist bin, wäre es toll wenn mir jemand zeigen könnte, wie eine solche Abfragelogik aussehen könnte

Danke & Gruss, Roger

Hi,

Ich habe eine Frage zur Logik einer Implementation für eine
SQL-Datenbankabfrage:

was Du suchst nennt sich Outer Join. Zur Verdeutlichung zunächst der Inner Join:

select s.name, s.id, g.gruppenid
 from sachbearbeiter as s,
 gruppenmitgliedschaften as g
 where s.id = g.mitgliedid

(Das ist die Oracle-Schreibweise. Es gibt andere Schreibweisen dafür, je nachdem, welches RDBMS Du verwendest. Du schreibst leider nichts dazu).

Dieser Join hat für Dich den Nachteil, daß nur die Sachbearbeiter aufgelistet werden, die Mitglied in einer Gruppe sind. Im Gegensatz dazu der Outer Join: er listet sie alle auf, und zwar in zwei Varianten: einmal der Left Join (liste mir alle Sachbearbeiter, und zeige mir die Gruppenmitgliedschaften, so sie denn vorhanden sind) und dann der Right Join (Zeige mir alle Gruppen. Außerdem bitte die zugeordneten Sachbearbeiter, wenn vorhanden):

Left Join:

select s.name, s.id, g.gruppenid
 from sachbearbeiter as s,
 gruppenmitgliedschaften as g
 where s.id(+) = g.mitgliedid

Right Join:

select s.name, s.id, g.gruppenid
 from sachbearbeiter as s,
 gruppenmitgliedschaften as g
 where s.id = g.mitgliedid(+)

Wenn Du MS-SQL odes MySQL verwendest, wird Dich die Schreibweise weitertragen:

select s.name, s.id, g.gruppenid
 from sachbearbeiter as s INNER JOIN 
 gruppenmitgliedschaften as g
 ON s.id = g.mitgliedid

Gruß

J.

Wenn Du MS-SQL odes MySQL verwendest, wird Dich die
Schreibweise weitertragen:

select s.name, s.id, g.gruppenid
from sachbearbeiter as s INNER JOIN
gruppenmitgliedschaften as g
ON s.id = g.mitgliedid

Bzw. LEFT JOIN statt INNER JOIN. RIGHT JOIN gibt’s glaube ich auch, benutzt aber kein Mensch, da man ja einfach die Reihenfolge umdrehen kann…

Grüße
Bruno