Autor Beitrag
Yacoon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72



BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72



BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: 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:

ausblenden 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? :oops: :roll:
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 14.03.03 12:46 
Tut mir leid, aber ich bin gerade ein wenig verwirrt... :roll:

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 :wink: ).

Cu,
Udontknow
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Fr 14.03.03 13:13 
aber inwiefern sind joins performancekiller???

Gruß
Ken
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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. 8) 8)

@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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 497

WinXP HE
D6 Enterprise
BeitragVerfasst: Fr 14.03.03 14:22 
Hi yacoon,
so müßte es gehen:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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:

ausblenden Quelltext
1:
2:
select * from Vater where not exists
(select * from Kind where Kind.Vater_ID=Vater.ID)


Cu,
Udontknow
Andi1982
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 497

WinXP HE
D6 Enterprise
BeitragVerfasst: 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...