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:
| Select P.Name, X.Anzahl FROM PERSONEN P, (ZZZZZ) X WHERE (X.Anzahl>1)
Select P.Name, X.Anzahl FROM PERSONEN P, (ZZZZZ) X WHERE (X.Anzahl=0)
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
D. Annies hat folgendes geschrieben : |
| 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
D. Annies hat folgendes geschrieben : |
| 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.
D. Annies hat folgendes geschrieben : |
| 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!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!