Post by Michael ZimmermannMein Gott, macht ihr einen Umstand! ;-)
Joo, aber falsch. ;-)
Post by Michael ZimmermannDistinct unterdrückt doppelte Datensätze, die durch die
Feldauswahl entstehen. Die nicht in die Abfrage
aufgenommenen Felder werden nicht herangezogen. Bei
DistinctRow werden auch die nicht im Select genannten
Felder auf Gleichheit geprüft.
In ordentlich konzipierten DBen wird man in
Abfragen auf Tabellen keinen Unterschied bemerken,
da eine mit Primärschlüssel versehene Tabelle keine
zwei völlig identischen Datensätze enthalten kann
(übrigens eine Forderung der relationalen Algebra)
und daher Distincrow nie greift.
In Abfragen kann es aber zu identischen DS kommen. Wenn
darauf weitere Abfragen aufbauen, dann kann man einen
NName VName
Müller Hans
Müller Hans (ein anderer)
Müller Karl
Meier Gustav
Müller (Hans, Hans und Karl)
Meier (Gustav)
weil Müller = Müller nur ein DS
Müller (die 2 Hänse)
Müller (Karl)
Meier (Gustav)
weil Müller = Müller und Hans = Hans, aber Hans <> Karl 3 DS
Naa, 4 DS. DISTINCTROW legt die 2 Hänse nie zusammen.
Exkurs:
Wenn die Abfrage nur diese 1 Tabelle enthält, also
SELECT DISTINCTROW NName FROM tblNamen
dann kommen nicht 3 DS sondern (alle) 4. Bei DISTINCTROW geht's
nämlich nicht um das Zusammenlegen von gleichen DS sondern
um das nur einmalige Darstellen jedes DS.
Bei nur 1 Tabelle ist das Ergebnis daher ident mit dem von SELECT
oder SELECT ALL. DISTINCTROW wird schlicht ignoriert.
Witzig wird's erst bei mind. 2 Tabellen.
Hier geht es analog um das einmalige Darstellen jeder DS-Kombination.
Dabei werden im Ergebnis aber immer nur DS jener Tabelle(n)
berücksichtigt, deren Felder im SELECT vorkommen.
Fügen wir zunächst eine Tabelle mit Brüdern hinzu, dann haben wir:
tblNamen
id
1 (Müller Hans)
2 (Müller Hans - ein anderer)
3 (Müller Karl)
4 (Meier Gustav)
tblBrueder
BruederId, id
1, 1 (Paul, Bruder von Müller Hans)
2, 2 (Max, Bruder von Müller Hans - ein anderer)
3, 2 (Moritz, Bruder von Müller Hans - ein anderer)
Wir verknüpfen geradeaus:
SELECT tblNamen.id
FROM tblNamen INNER JOIN tblBrueder ON tblNamen.id = tblBrueder.id
liefert 3 DS:
1 (-1, Hans - Paul)
2 (-2, Hans, der andere - Max)
2 (-3, Hans, der andere - Moritz)
SELECT DISTINCTROW tblNamen.id...
liefert hingegen nur die 2 involvierten DS von tblNamen:
1 (Hans)
2 (Hans, der andere)
Im Standard-SQL entspricht das
SELECT tblNamen.id
FROM tblNamen
WHERE tblNamen.id IN (SELECT tblBrueder.id FROM tblBrueder)
Wenn hingegen auch 1 Feld von tblBrueder im SELECT steht, z.B.
SELECT DISTINCTROW tblNamen.id, tblBrueder.BruederId...
ist der Zauber von DISTINCTROW dahin, entspricht es wieder
SELECT ALL und liefert alle 3 DS.
Dieselben Prinzipien gelten bei _mehr_ als 2 involvierten Tabellen.
Fügen wir eine 3. Tabelle mit Kindern der Brüder hinzu:
tblKinder
KinderId, BruederId
1, 1 (Kind von Paul)
2, 1 (anderes Kind von Paul)
3, 2 (Kind von Max)
4, 2 (anderes Kind von Max)
5, 3 (Kind von Moritz)
Wir erweitern obiges SQL-Bsp. und verknüpfen wieder geradeaus:
SELECT tblNamen.id
FROM (tblNamen INNER JOIN tblBrueder ON tblNamen.id = tblBrueder.Id)
INNER JOIN tblKinder ON tblBrueder.BruederId = tblKinder.BruederId
ergibt 5 DS:
1 (-1-1, Hans - Paul - Kind von Paul)
1 (-1-2, Hans - Paul - anderes Kind von Paul)
2 (-2-3, Hans, der andere - Max - Kind von Max)
2 (-2-4, Hans, der andere - Max - anderes Kind von Max)
2 (-3-5, Hans, der andere - Moritz - Kind von Moritz)
SELECT DISTINCTROW tblNamen.id...
hingegen liefert wieder nur die 2 involvierten DS von tblNamen:
1 (Müller Hans)
2 (Müller Hans - ein anderer)
Erweitert man um Felder der anderen Tabellen, ändert sich bei
einfachem SELECT nie etwas an der zurückgelieferten DS-Menge.
Anders mit:
SELECT DISTINCTROW tblNamen.id, tblBrueder.id...
liefert wieder 3 DS, nämlich die 2 Hänse mit den Brüdern, die Kinder haben.
Jede Hans-Bruder-Kombination aber nur einmal, egal wieviele Kinder
die Brüder haben:
1, 1 (Hans + Paul)
2, 2 (Hans, der andere + Max)
2, 3 (Hans, der andere + Moritz)
Nimmt man auch noch 1 Feld von der Kinder-Tabelle mit in's SELECT
ist der Zauber von DISTINCTROW wieder vorbei, alle 5 DS usw. usf.
(BTW Insiderjoke: André kaufst du mir das elaboriert als Artikel ab? ;-)
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
Datenbankprofis: http://www.dbdev.org