Zum Inhalt springen

Killer-Abfrage .. wer kann das erklaeren?


xound

Empfohlene Beiträge

Hallo,

ich habe hier eine SQL "Killer"-Abfrage und wuerde gerne verstehen, was da passiert. Kann mir jemand erklaeren, was genau gemacht wird und wie man eine solche Abfrage versteht?

Hier erstmal die gegebenen Tabellen:

Erste Tabelle

A = 1, 2, 3

B = 2, 3, 3

Zweite Tabelle

C = 3, 4, 6

D = 4, 5, 7

Die Kommas stehen fuer einen Zeilenwechsel

Nun die Abfrage

select A, sum(D)

from Tabelle1, Tabelle2

where not(

(A = 1 and C = 6)

or (A = 3 and C = 3)

or (A =2 and not (C=3))

)

group by A, B

having A < 4

and (sum(D) < 10)

and (max© = 4)

Vielleicht kann das ja jemand von Euch? Danke vorab!

Gruss,

xound

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin !

Also, folgendes passiert:

erstmal wird ein karthesisches Produkt gebildet, da ja 2 Tabellen im FROM Statement verknüpft werden, das sieht dann so aus:

Z | a | b | c | d

1 | 1 | 2 | 3 | 4

2 | 1 | 2 | 4 | 5

3 | 1 | 2 | 6 | 7

4 | 2 | 3 | 3 | 4

5 | 2 | 3 | 4 | 5

6 | 2 | 3 | 6 | 7

7 | 3 | 3 | 3 | 4

8 | 3 | 3 | 4 | 5

9 | 3 | 3 | 6 | 7

dann arbeitet er die Where-Klausel ab:

where not((A = 1 and C = 6)

or (A = 3 and C = 3)

or (A =2 and not (C=3)))

hier wirft er alle Zeilen raus, die eine von den 3 Klammern nicht erfüllt, da sie ja mit ODER verknüpft sind.

A=1 AND C=6 --> Zeile 3

A=3 AND C=3 --> Zeile 7

A=2 AND NOT C=3 --> Zeile 5 (A ist 2 & C ist 4) und Zeile 6 (A ist 2 & C ist 6)

übrig bleibt:

Z | a | b | c | d

1 | 1 | 2 | 3 | 4

2 | 1 | 2 | 4 | 5

4 | 2 | 3 | 3 | 4

8 | 3 | 3 | 4 | 5

9 | 3 | 3 | 6 | 7

group by A, B

jetzt gruppiert er die Tabelle nach den Spalten A und B, das heisst alle Zeilen in denen A und B übereinstimmen, werden zusammengefasst.

Z | a | b | c | d

Gruppe 1

1 | 1 | 2 | 3 | 4

2 | 1 | 2 | 4 | 5

Gruppe 2

4 | 2 | 3 | 3 | 4

Gruppe 3

8 | 3 | 3 | 4 | 5

9 | 3 | 3 | 6 | 7

Mit diesen Gruppen passiert folgendes:

- er nimmt alle Gruppen deren Wert in Spalte A kleiner als 4 ist (trifft ja auf jede zu)

having A < 4

- dann muß die Summe aller Werte von Spalte D in einer Gruppe kleiner als 10 sein; Gruppe 1 hat 9 (stimmt), Gruppe 2 hat 4 (stimmt) und Gruppe 3 hat 12 (fällt damit raus).

and (sum(D) < 10)

- schliesslich wird der größte Wert aus Spalte C in einer Gruppe genommen und dieser muss dann gleich 4 sein; Gruppe 1 hat maximal 4 (stimmt) und Gruppe 2 hat 3 (fällt auch raus).

and (max© = 4)

Ergebnis ist dann dies:

Z | a | b | c | d

Gruppe 1

1 | 1 | 2 | 3 | 4

2 | 1 | 2 | 4 | 5

jetzt gibt er dir vom verbliebenem Rest Spalte A aus (ist 1) und die Summe von Spalte D (ist 9)

select A, sum(D)

Das wars auch schon ! :D

gruß

Christian

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

sehr gut erklaert! danke!! Soweit hab ich es verstanden.

Mir brennt allerdings ein kleiner Dorn im Auge:

- schliesslich wird der größte Wert aus Spalte C in einer Gruppe genommen und dieser muss dann gleich 4 sein; Gruppe 1 hat maximal 4 (stimmt) und Gruppe 2 hat 3 (fällt auch raus).

and (max© = 4)

Ergebnis ist dann dies:

Z | a | b | c | d

Gruppe 1

1 | 1 | 2 | 3 | 4

2 | 1 | 2 | 4 | 5

Warum wird in dem Fall die gesamte Gruppe genommen, wenn (max© = 4) nur auf die erste Zeile der Gruppe zutrifft??

Gruss,

xound

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da die Max Bedingung in der Having-Klausel steht, wendet er sie immer auf die gesamten Gruppen an. Er nimmt dann von jeder Gruppe den jeweils größten Wert aus allen Zeilen der Gruppe und vergleicht ihn mit 4.

Bei der ersten Gruppe hat c die Werte 3 und 4 --> 4

bei der zweiten den Wert 3

und bei der dritten die Werte 4 und 6 --> 6

Link zu diesem Kommentar
Auf anderen Seiten teilen

aha, und wenn er eine gruppe gefunden hat, in der der max-wert = 4 ist, dann gilt alles nachfolgende fuer diese gesamte gruppe und nicht nur den teil der gruppe...

die having klausel stellt also die virtuelle gruppierung auf und die "group by" filtert weitere gruppierungen in den having-gruppen heraus, wobei alle bedinungen, die in der "group by" auftauchen immer fuer die gesamte gruppe gelten!

wenn also gruppe 2 und gruppe 3 rausgeschmissen werden, weil der max wert nicht gleich 4 ist, werden in der gruppe 1 alle zeilen uebernommen, auch wenn nur in einer zeile der max-wert = 4 ist?

Link zu diesem Kommentar
Auf anderen Seiten teilen

aha, und wenn er eine gruppe gefunden hat, in der der max-wert = 4 ist, dann gilt alles nachfolgende fuer diese gesamte gruppe und nicht nur den teil der gruppe...

genau !

die having klausel stellt also die virtuelle gruppierung auf und die "group by" filtert weitere gruppierungen in den having-gruppen heraus, wobei alle bedinungen, die in der "group by" auftauchen immer fuer die gesamte gruppe gelten!

ja mit Group By legst Du fest wie er die Zeilen zusammenfässt, also nach A & B in dem Beispiel, und mit dem Having werden die Kriterien festgelegt, nach denen ungewollte Gruppen herausgefiltert werden.

wenn also gruppe 2 und gruppe 3 rausgeschmissen werden, weil der max wert nicht gleich 4 ist, werden in der gruppe 1 alle zeilen uebernommen, auch wenn nur in einer zeile der max-wert = 4 ist?

genau, da er bei Anweisungen wie Max, Min, Sum usw. die gesamte Gruppe als ganzes betrachtet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...