xound Geschrieben 25. November 2002 Teilen Geschrieben 25. November 2002 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tauron Geschrieben 25. November 2002 Teilen Geschrieben 25. November 2002 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 ! gruß Christian Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
xound Geschrieben 25. November 2002 Autor Teilen Geschrieben 25. November 2002 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tauron Geschrieben 25. November 2002 Teilen Geschrieben 25. November 2002 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
xound Geschrieben 25. November 2002 Autor Teilen Geschrieben 25. November 2002 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
tauron Geschrieben 25. November 2002 Teilen Geschrieben 25. November 2002 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
xound Geschrieben 25. November 2002 Autor Teilen Geschrieben 25. November 2002 super- du hast mir geholfen!! <b>THX!!!</b> Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.