Philipp Hasenfratz: Query an mehrere Tabellen

Beitrag lesen

Halihallo Ilja

x.id ist primary key
y,z.id ist kein primary key

Hier wirst du das Problem haben, dass auf ein x.id mehrere y-Records
und mehrere z-Records passend sind.

nicht zwangsläufig, dass es kein pk ist schlisst nicht aus, dass es den constraint unique besitzt. aber grosser wahrscheinlichkeit wird es so sein, wie du schreibst.

Jep, das ging bei meinen Überlegungen unter; wobei ich es eben als
Aufgabe des Fragestellers sehe uns dies mitzuteilen; ich habe
später noch gefragt, ob y.id nicht auch PRIMARY KEY (oder eben
besser: zumindest UNIQUE) ist.

Ein COUNT(*) würde dir bei einem

GROUP BY x.id also (AnzahlRecordsAusY * AnzahlRecordsAusZ) liefern und
das möchtest du nicht.

ein count(*) würde bei einem group by x.id meiner meinung nach nicht AnzahlRecordsAusY * AnzahlRecordsAusZ liefern.

Jep, ebenfalls richtig wenn man davon ausgeht, dass die WHERE-Klausel
folgendes enthält: x.id=y.id AND x.id=z.id.
y.id=z.id ist dann implizit und bricht das Kreuzprodukt zwischen y
und z auf. Was am Ende bleibt ist COUNT(*)=Summe aus Y und Z-
Datensätzen, wenn dann noch x.id=y.id ist und y.id UNIQUE, ist
COUNT(*) die gewünschte Anzahl z-Records. Vorausgesetzt ich mache
jetzt nicht noch einen Überlegungsfehler :-)

Falls y.id auch PRIMARY KEY wäre, hätte man
keine Probleme => GROUP BY x.id, y.id, y.text und COUNT(*) für die
Anzahl z-Records.

auch das würde ich anders sehen. erstens hat das group by nichts mit pk's zu tun.

Natürlich nicht, aber: Wenn sowohl der Primary Key von x und y im
GROUP BY auftaucht, wird nach jedem x und y Datensatz gruppiert und
der COUNT(*) liefert die Anzahl z-Records. Da x und y nach neuen
Erkenntnissen eine 1:1 Beziehung eingehen, wird der x und y Datensatz
zusammengezogen und so gruppiert, somit zählt COUNT(*) die Datensätze
in z. y.text steht nur in GROUP BY, dass man dieses Attribut ohne
Aggregatsfunktionen selektieren darf, hat jedoch keine Auswirkungen
auf die Gruppierung (da der PRIMARY KEY der Relation y enthalten
ist).

und zweites würde diese konstellation des group by den falschen count liefern und somit zwangsweise falsche datensätze.

Warum? - Weil ich auch noch nach y.text gruppiere? - Nein. Das ist
richtig, denn dieses y.text gruppiert nicht weiter, da bereits der
PRIMARY KEY von y im GROUP BY steht, somit ist eine Gruppierung nach
y.text bereits implizit (da ja jeder y Datensatz automatisch als
Gruppierungsglied herangezogen wird).

Viele Grüsse

Philipp