Autor Beitrag
D. Annies
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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 :

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: So 17.04.11 08:11 
Das geht so nicht mit einem Select.
ausblenden 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.

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Mo 18.04.11 06:12 
Danke für eure Ideen.
Um herauszufinden, wer etwas ausgeliehen hat, da geht Folgendes:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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...
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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?
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19336
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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?

Für diesen Beitrag haben gedankt: D. Annies
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Mo 18.04.11 08:16 
Juhu, der left-outer-join-Befehl klappt hervorragend!
Danke, Sebastian!

_________________
ut vires desint, tamen est laudanda voluntas