Entwickler-Ecke

Datenbanken - SQL-Abfrage über zwei Tabellen


D. Annies - So 17.04.11 06:32
Titel: SQL-Abfrage über zwei Tabellen
Hi, Delpher,

ich habe eine Tabelle mit Personen und eine zweite mit Artikeln.
Aufbau: Name, Vorname, Email, aktiv
(alle Personen sind unterscheidbar) bzw.

Titel, Name, Vorname, AusleiheDatum
wobei hier alle Titel stehen, egal ob ausgeliehen oder nicht
(wenn nicht ausgeliehen, dann ist Name etc. leer,
der gleiche Titel kommt also mehrfach vor)

Ich will mit einem SQL-Befehl z.B.
Alle Personen aus L, die keinen Artikel aus B ausgeliehen haben
Alle Personen aus L, die (mindestens) einen Artikel aus B ausgeliehen haben
selektieren.

Ich habe es versucht mit :


Delphi-Quelltext
1:
select L.VORNAME, L.NAME, B.TITEL, B.A_DATUM from "%s" L, "%s" B where (L.NAME = B.NAME) and (???)                    


Weiter komme ich nicht.
Wer weiß da Rat?
Gruß, Detlef


Xion - So 17.04.11 08:11

Das geht so nicht mit einem Select.

SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
#alle mit mehr als einem ausgeliehen:
Select P.Name, X.Anzahl FROM PERSONEN P, (ZZZZZ) X WHERE (X.Anzahl>1)

#alle mit nie etwas ausgeliehen: 
Select P.Name, X.Anzahl FROM PERSONEN P, (ZZZZZ) X WHERE (X.Anzahl=0)

#mit ZZZZZ:
SELECT count(A.Name) as Anzahl FROM ARTIKEL A


Zumindest vom Prinzip her. Wie es die BDE genau haben will, kann ich nicht sagen.


jaenicke - So 17.04.11 08:46

Ein inner join auf den Namen und Vornamen liefert alle Namen, die in beiden Tabellen vorkommen. Das sind also die, die etwas ausgeliehen haben.

Ein left outer join where titel is null liefert alle, die nichts ausgeliehen haben.


D. Annies - Mo 18.04.11 06:12

Danke für eure Ideen.
Um herauszufinden, wer etwas ausgeliehen hat, da geht Folgendes:


Delphi-Quelltext
1:
Select distinct L.Name, L.VorName, L.Kuerzel FROM "%s" L, "%s" B WHERE (L.Name = B.Name)                    


Aber, wenn jemand nichts ausgeliehen hat?
Hat jemand noch eine Idee?

Detlef


jaenicke - Mo 18.04.11 07:28

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
Aber, wenn jemand nichts ausgeliehen hat?
Was hast du gegen meine Lösung? Die funktioniert doch problemlos. :gruebel:

// EDIT:
Ok, als fertige Lösung...

SQL-Anweisung
1:
select distinct L.Name, L.VorName, L.Kuerzel from "%s" L left outer join "%s" B on L.name = B.name and L.Vorname = b.Vorname where B.name is null                    
Ungetestet, aber sollte die BDE schlucken.


D. Annies - Mo 18.04.11 07:48

Hallo, Sebastian,

ja, die BDE schluckt den Befehl problemlos, aber die Ergebnismenge ist leer, obwohl es einige Personen gibt,
die nichts ausgeliehen haben.

By the way, wo ist denn hier der Fehler?

Delphi-Quelltext
1:
select B.Titel, count(B.Titel) as Anzahl, B.Name, L.Name, L.VorName, L.Kuerzel from "%s" L, "%s" B,  where (L.Name = B.Name) group by L.Name, L.Vorname, L.Kuerzel                    

Ich bekomme einen Indexfehler angezeigt ??

Gruß, Detlef


jaenicke - Mo 18.04.11 07:52

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
ja, die BDE schluckt den Befehl problemlos, aber die Ergebnismenge ist leer, obwohl es einige Personen gibt, die nichts ausgeliehen haben.
Ist denn Name wirklich null, wenn ein Titel nicht ausgeliehen ist oder leer? Du hattest geschrieben null, dementsprechend ist die where-Abfrage auch formuliert. Wenn es nur leer ist, musst du das natürlich entsprechend ändern...

Und um dann alle zu bekommen, die nichts ausgeliehen haben, musst das noch weiter anpassen, das ist nur eine kleine Demo für left outer join.

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
Ich bekomme einen Indexfehler angezeigt ??
Ist denn ein Index gesetzt?


D. Annies - Mo 18.04.11 08:12

Ok, ich setze also leer.

Ein Index ist nicht gesetzt.

Na denn, weiter kämpfen :)


D. Annies - Mo 18.04.11 08:16

Juhu, der left-outer-join-Befehl klappt hervorragend!
Danke, Sebastian!