Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Zu viele Ergebnisse

  Alt 7. Mai 2005, 16:44
Ich habe mir die Tabellen im Einzelnen *nicht* angesehen, aber ein LEFT JOIN liefert alle Ergebnisse der 'linken' Seite, egal, ob die mit der 'rechten' Seite in Einklang (joined) gebracht werden können.

Das Konstruct "select * from a,b where a.bla = b.bla" ist alt und ungenau. Es sollte nicht mehr verwendet werden. Benutze lieber reine joins. hier also "select * from a join b on a.bla = b.bla"

Wenn Du zählst und mehrere Tabellen 'joinst', dann befolge folgende Regeln:
1. WAS willst Du zählen? Count (*) ist manchmal ungenau. Vielleicht willst Du die ID's nur zählen. Benutze DISTINCT, um doppelte Treffer zu eliminieren

2. Verwende "Left join" nur dann, wenn Du wirklich ALLE Zeilen der linken Tabelle haben willst. Das ist bei einem Aggregat (hier: Count) i.a. nicht erwünscht.

3. Erstelle erstmal die Ergebnismenge und überprüfe die genau. Erst wenn Du sicher bist, das Richtige zu bekommen, ersetze das * durch das Aggregat.

4. Ein Trick: Manchmal ist es einfacher, SUM() anstatt COUNT() zu verwenden. Wenn Du z.B. nur bestimmte Kandidaten zählen willst, oder gleich mehrere Zählungen auf einmal durchführen willst, dann mach es so: Sei "Friends" eine Tabelle meiner Kumpels und "Age" das Alter. Dieses Select liefert mir alle Rentner, sowie gleichzeitig noch die über 40 Jährigen...
Delphi-Quellcode:
select sum (case when age >=65 then 1 else 0 end) as Rentner,
sum (case when age between 40 and 65 then 1 else 0 end) as AlteSaecke
from Friends
Abschliessend ein Tip: Ich stelle mir ein Join immer als zwei sich überschneidende Kreise vor, wie die gute alte Mengenlehre in der Grundschule.
Join liefert die 'Mitte'.
Left Join liefert den linken Kreis (und alles, was in der Mitte ist).
Right Join liefert den rechten Kreis (und alles, was in der Mitte ist).
Full Join liefert Alles.

So genug geklugscheissert.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat