| Autor |
Beitrag |
D. Annies
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: So 17.04.11 06:32
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
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: 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.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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
_________________ ut vires desint, tamen est laudanda voluntas
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
// 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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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
_________________ ut vires desint, tamen est laudanda voluntas
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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?
Für diesen Beitrag haben gedankt: D. Annies
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Mo 18.04.11 08:12
Ok, ich setze also leer.
Ein Index ist nicht gesetzt.
Na denn, weiter kämpfen 
_________________ ut vires desint, tamen est laudanda voluntas
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Mo 18.04.11 08:16
Juhu, der left-outer-join-Befehl klappt hervorragend!
Danke, Sebastian!
_________________ ut vires desint, tamen est laudanda voluntas
|
|
|