Einzelnen Beitrag anzeigen

Benutzerbild von f4k3
f4k3

Registriert seit: 15. Aug 2007
Ort: Nürnberg
313 Beiträge
 
Delphi 2007 Architect
 
#5

Re: SQL | INNER JOINS über mehrere Tabellen

  Alt 9. Jun 2009, 12:44
Zitat von Leonard:
Zitat von f4k3:
mhm ... dat is schlecht ... weil ich beide Prüfungen brauche ...
aber JOINS lassen sich bestimmt mit AND, OR, XOR verknüpfen oder?
Das sollte gehen. Kann es aber auch sein, dass in k.KON_KONTAKTART_ID und kt.KON_KONTAKTART_ID die gleichen Werte stehen?

Noch etwas anderes ist mir jetzt aufgefallen. Es kann auch noch sein, dass du die letzten beiden INNER JOIN Anweisungen tauschen musst. Die Verknüpfung zu kasp wird erst in der letzten Anweisung erstellt, aber schon in der vorherigen verwendet. Es kann aber sein, dass Firebird das so kann.

Alt:
SQL-Code:
INNER JOIN KON_ABTEILUNG kabt ON (kasp.ABTEILUNG_ID = kabt.KON_ABTEILUNG_ID)
INNER JOIN KON_ANSPRECHPARTNER kasp ON (kasp.KONTAKT_ID = k.KON_ID)

Neu:
SQL-Code:
INNER JOIN KON_ANSPRECHPARTNER kasp ON (kasp.KONTAKT_ID = k.KON_ID)
INNER JOIN KON_ABTEILUNG kabt ON (kasp.ABTEILUNG_ID = kabt.KON_ABTEILUNG_ID)
Alles klar ... Die alte Variante funktioniert aber auch ... habs in Database Workbench 3 Lite for Firebird getestet.

Mir is nur n kleiner Fehler unterlaufen ... also ich möchte ja nur die Informationen zu einem bestimmten Kontakt.
und ich hab 8 Tabellen für meine Kontaktverwaltung (kommen später noch mehr) ... Es ist aber keine notwendigkeit dass
in allen Tabellen Informationen zum Kontakt vorhanden sein müssen. Wenn bei meiner Abfrage jedoch in einem JOIN kein
Datensatz gefunden wird ... ist der Kontakt auch nicht in der Ergebnismenge obwohl ich genau nach diesem Kontakt Suche ...

Muss ich dass dann mit einem OUTER JOIN lösen oder alle JOINS rausschmeissen und die Daten händisch abfragen? mit einer WHERE-Klausel?

Ich hab nämlich mein Lösungsansatz mal an ein paar Testdaten ausprobiert und bin drauf gestossen dass ich nach einem
Benutzer suche ... der aber nicht in der Ergebnismenge auftaucht obwohl er vorhanden ist, weil eben in 2 Tabellen die mit
JOINS abgefragt werden keine Werte zu diesem Nutzer enthalten sind ... wenn ich Werte einfüge wird der Benutzer angezeigt ...

Hier mal die Abfrage ...

SQL-Code:
SELECT

    // BEN
    b.BEN_ID, b.RECHTE_ID, b.ABTEILUNG_ID, b.BENUTZERNAME, b.PASSWORT,
    b.VORNAME, b.NACHNAME, b.GEBURTSTAG, b.EINSTELLUNGSDATUM, b.ENTLASSUNGSDATUM,
    b.EINGELOGGT,
    
    // BEN_ABTEILUNG
    bab.BEN_ABTEILUNG_ID, bab.ABTEILUNGSNAME,
    
    // BEN_ADRESSE
    bad.BEN_ADRESSE_ID, bad.BENUTZER_ID, bad.KONTAKTART_ID, bad.STRASSE,
    bad.POSTLEITZAHL, bad.ORT,
    
    // BEN_EMAIL
    be.BEN_EMAIL_ID, be.BENUTZER_ID, be.KONTAKTART_ID, be.EMAIL_ADRESSE,
    
    // BEN_KONTAKTART
    bk.BEN_KONTAKTART_ID, bk.BEZEICHNUNG, bk.BESCHREIBUNG,
    
    // BEN_NOTIZEN
    bn.BEN_NOTIZEN_ID, bn.BENUTZER_ID, bn.BEZEICHNUNG, bn.BESCHREIBUNG,
    bn.ANGELEGT, bn.GEAENDERT,
    
    // BEN_RECHTE
    br.BEN_RECHTE_ID, br.BEZEICHNUNG, br.ADMINISTRATOR,
    
    // BEN_TELEFON
    bt.BEN_TELEFON_ID, bt.BENUTZER_ID, bt.KONTAKTART_ID, bt.RUFNUMMER

FROM BEN b, BEN_KONTAKTART bk

    // INNER JOIN BEN_RECHTE
    INNER JOIN BEN_RECHTE br
      ON (b.RECHTE_ID = br.BEN_RECHTE_ID)
    
    // INNER JOIN BEN_ABTEILUNG
    INNER JOIN BEN_ABTEILUNG bab
      ON (b.ABTEILUNG_ID = bab.BEN_ABTEILUNG_ID)
    
    // INNER JOIN BEN_ADRESSE
    INNER JOIN BEN_ADRESSE bad
      ON (bad.BENUTZER_ID = b.BEN_ID)
    
    // INNER JOIN BEN_EMAIL
    INNER JOIN BEN_EMAIL be
      ON (be.BENUTZER_ID = b.BEN_ID)
    
    // INNER JOIN BEN_NOTIZEN
    INNER JOIN BEN_NOTIZEN bn
      ON (bn.BENUTZER_ID = b.BEN_ID)
    
    // INNER JOIN BEN_TELEFON
    INNER JOIN BEN_TELEFON bt
      ON (bt.BENUTZER_ID = b.BEN_ID) AND (bt.KONTAKTART_ID = bk.BEN_KONTAKTART_ID)

WHERE b.BENUTZERNAME = 'Jonny'
MfG f4k3
Sascha
  Mit Zitat antworten Zitat