| Autor |
Beitrag |
Yacoon
      
Beiträge: 72
|
Verfasst: Do 13.03.03 19:51
Hi zusammen!
Habe folgendes Problem.
Ich habe 2 Tabellen. Eine Master und eine Detailtabelle. Wenn ich alle Väter (master) haben möchte, die Kinder haben (Detail), dann sieht das ja ungefähr so aus:
Quelltext 1:
| SELECT * FROM VATER, KIND WHERE VATER.ID = KIND.VATER_ID |
Jetzt möchte ich genau dieses Statement nigieren, das heisst ich möchte jetzt nicht alle Väter die ein Kind haben, sondern die die kein Kind haben.
Wenn ich aber folgendes Statement absetze:
Quelltext 1:
| SELECT * FROM VATER, KIND WHERE NOT (VATER.ID = KIND.VATER_ID) |
dann holt er mir alle Väter, bis auf den Ersten Vater, er kein Kind hat?
Kann mir da einer helfen?
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Do 13.03.03 20:07
| Yacoon hat folgendes geschrieben: | | Jetzt möchte ich genau dieses Statement negieren,... |
wie wärs denn mit WHERE ID_KIND = NULL 
_________________ Gruß
Hansa
|
|
Yacoon 
      
Beiträge: 72
|
Verfasst: Do 13.03.03 20:49
Ich glaube du hast mein Problem nicht ganz verstanden!
Macht aber niochts. Noch mal.
In der Vater Tabelle sind 80000 Datensätze. In der Kind Tabell nur 10.
Wenn ich jetzt einen join mache
Quelltext 1:
| SELECT VATER.* FROM VATER, KIND WHERE NOT (VATER.ID = KIND.VATER_ID) |
dann bekomme ich nur die Väter, die auch ein Kind haben.
In der Vater Tabelle gibt es keine Kind_ID also wo bitte soll ich denn sagen where KIND_ID = NULL
Das ist doch dann das selbe als wenn ich sage, selektiere mir alle Kinder die nicht vorhanden sind, oder? Ist doch nicht wirklich sinnvoll.
Vielleicht verstehe cih aber auch deine Logik nicht.
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Do 13.03.03 22:50
| Yacoon hat folgendes geschrieben: | | ...Wenn ich jetzt einen join mache... |
na gut und wie wärs mit OUTER JOIN?
_________________ Gruß
Hansa
|
|
kiwicht
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Do 13.03.03 23:43
Yacoon, ich weiß was du meinst, ein ähnliches Problem hat ich auch einmal.
Ich hab eine ArtikelDatenbank in der zu jedem Artikel ein Bild existiert (theoretisch). Dieses Bild hat als Namen halt immer die entsprechende Artikelnummer. Ich wollte nun, um mein Bildverzeichnis zu pflegen, rauskriegen, zu welchem Datensatz KEIN bild vorhanden ist.
Zugegeben, das ist deinem Problem so gut wie garnicht ähnlich, aber der Ansatz ist der gleiche.
Meine Idee zur Lösung war dann halt der umständliche Weg:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| [b](Schematisch)[/b] Query1.First
If NOT FileExists(Query1.FieldByName('artikel').AsString + '.jpg' ) then "MERKE DIR DIESE ARTIKELNUMER"
Query1.Next
und nochmal von vorne, bis EOF... |
Die gemerkten Datensätze konnte ich dann auch per SQL abfragen. Der einzige Nachteil: Es funzte nicht! Weiß nicht warum, aber vielleicht hilft dir die Idee ja weiter...
idS
mfg
kiwicht
____
bin mir grad garnicht so sicher, hab ich das Thema verfehlt? Aber es kommt doch aufs gleiche raus, oder? 
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 14.03.03 12:16
Hallo!
Ich würde es so machen: Zeige alle Väter, bei denen die Anzahl der Kinder=0 ist.
Quelltext 1: 2:
| select * from Vater where (select count(*) from Kind where Vater_ID=Vater.ID)=0 |
So eine Abfrage, dessen Unterabfrage Parameter aus der Hauptabfrage bezieht, nennt man "correlated Subquery". Ist nicht unbedingt performant, aber es klappt.
Cu,
Udontknow
Zuletzt bearbeitet von Udontknow am Fr 14.03.03 14:25, insgesamt 1-mal bearbeitet
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Fr 14.03.03 12:25
Wir stochern hier zuviel im Nebel rum. Präsentiere bitte mal die genaue Definition von Vater und Kind.
@Udontknow: Dein Vorschlag müßte auch gehen, aber in diesem Falle würde doch naheliegen, die Datenmenge drastisch einzuschränken oder nicht ? So ähnlich, wie in meinem Beispiel.
_________________ Gruß
Hansa
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 14.03.03 12:32
@ Hansa:
Welches Beispiel? du meinst die Idee mit outer join? Ich persönlich mag joins nicht, ich kenne sie nur als Performance-Killer.
Cu,
Udontknow
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Fr 14.03.03 12:39
| hansa hat folgendes geschrieben: | wie wärs denn mit WHERE ID_KIND = NULL  |
Performancekiller ? Volltreffer, obwohl ich das nur aus der Theorie so kenne. Aber es sollte doch ein Join werden, Yacoon ?
_________________ Gruß
Hansa
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 14.03.03 12:46
Tut mir leid, aber ich bin gerade ein wenig verwirrt...
Was meinst du denn nun? Warum postest du noch einmal das mit dem Feld ID_Kind? Es gibt kein Feld ID_Kind. Die Referenz wird einzig und allein in der Tabelle Kind über das Feld VATER_ID hergestellt...
Yacoon möchte nur die Väter ermitteln, die keine Kinder haben (hmm, paradox, paradox  ).
Cu,
Udontknow
|
|
CenBells
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: Fr 14.03.03 13:13
aber inwiefern sind joins performancekiller???
Gruß
Ken
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Fr 14.03.03 13:23
Dann muß er eben doch einen OUTER JOIN benutzen, oder aber (ja wirklich paradox) die Kinder ermitteln, die einen oder auch keinen Vater haben, also genau umgekehrt. Um eventuell einen Vorschlag zu machen, wollte ich ja mal die Datenstruktur sehen, was er da genau macht. Paradoxerweise scheint sich die Frage aber sowieso erledigt zu haben.
@cenbells: nimm Dir mal das konkrete Beispiel 80000:10 Relation. Für die 10 Kinder rauszufinden brauchst Du 800000 Vater-Kind Relationen. Das ist dann ein JOIN. Besser wäre es wohl die 10 Kinder zu haben und die entsprechenden Väter dazu zu suchen. das ist aber jetzt nur auf die Schnelle hier hingeknallt. Vielleicht kann jemand das besser erklären. Und Tschüß.......
_________________ Gruß
Hansa
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 14.03.03 13:36
@Hansa:
Er will die Väter, die KEINE Kinder haben. Warum also ein full outer join, wenn du die Menge dann so einschränkst, daß sowieso nur Daten aus der Tabelle Vater angezeigt werden?
@Cenbells: Schaue mal hier nach:
www.delphi-forum.de/viewtopic.php?t=7954
|
|
Andi1982
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: Fr 14.03.03 14:22
Hi yacoon,
so müßte es gehen:
Quelltext 1:
| SELECT VATER.* FROM VATER, KIND WHERE NOT EXISTS (SELECT * FROM VATER, KIND WHERE VATER.ID = KIND.VATER_ID) |
Gruss Andi
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 14.03.03 14:29
@Andi1982:
Not exists kannte ich aber auch noch nicht. Toll! Dann muss ich ja gar nicht per Count=0 prüfen.
Aber wieso denn immer "from Vater, Kind"? Das müsste doch völlig ausreichen:
Quelltext 1: 2:
| select * from Vater where not exists (select * from Kind where Kind.Vater_ID=Vater.ID) |
Cu,
Udontknow
|
|
Andi1982
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: Fr 14.03.03 14:31
Ja, das müsste eigentlich auch ausreichen. Ein Fehler ist es aber nicht wenn man alle Tabels angibt. Ich hoffe das exists funktioniert da überhaupt!
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|