![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: IBExpert
Beschränkung bei GROUP BY wird nicht bemängelt
Hallo,
ich befasse mich zz. grundsätzlicher mit SQL. Dabei geht es mir nicht um eine konkrete Abfrage. Vielmehr versuche ich, ein Beispiel zu konstruieren, das zu einer bestimmten Bedingung passt bzw. diese Bedingung verletzt. Bei GROUP BY gibt es laut Doku* u.a. folgende Einschränkung: Zitat:
SQL-Code:
Beide GroupBy-Klauseln haben durch die Where-Bedingung natürlich keine praktische Bedeutung. (Alternative Abfragen mit JOIN wären sowieso einfacher.) Aber ich wundere mich.
select ID, Kurzbezeichnung, Ort,
( select count(*) FROM Mitarbeiter mit where mit.Abteilung_id = abt.Id /* Verknüpfung über ForeignKey */ group by mit.Abteilung_id ) as Anzahl from Abteilungen abt group BY id, Kurzbezeichnung, Ort; Andere Versuche, z.B. "group by Ort", führen nur zum Standardfehler, dass Spalten der Select-Liste im group by nicht enthalten sind. Danke für Erläuterungen! Jürgen * Als Ersatz für eine Firebird-Doku benutze ich vorwiegend die pdf-Dateien von Interbase 7.5, die ich mit Delphi 2005 erhielt. In der aktuellen ![]() |
Re: Beschränkung bei GROUP BY wird nicht bemängelt
Was ist jetzt eigentlich dein Problem?
Die äußere GROUP-BY-Klausel sorgt dafür, dass die Gruppe (id, kurzbezeichnung, ort) nur jeweils einmal im Ergebnis auftauchen. Was, wenn die Datenbankstruktur durchdacht ist, überflüssig ist, da sich dort keine Informationen aufblähen können, weil die ID (vermutlich) eindeutig ist. Da in dieser Gruppe auch die ID der Abteilung enthalten ist, kannst du sie in der Unterabfrage (im SELECT) verwenden. Da in der Unterabfrage auf eine Abteilung eingeschänkt wird ist dort das GROUP-BY überflüssig, es wird immer nur eine Abteilung ausgezählt und da die Unterabfrage in solch einer Verwendung nur einen Wert zurückliefern kann und darf, ist das GROUP-BY völlig überflüssig. Leichte Reduktion unnötiger Informationen...
SQL-Code:
SELECT id, kurzbezeichnung, ort,
(SELECT COUNT(*) FROM mitarbeiter WHERE abteilung_id = abt.Id) AS Anzahl FROM abteilungen abt GROUP BY id, kurzbezeichnung, ort; |
Re: Beschränkung bei GROUP BY wird nicht bemängelt
Zitat:
Zitat:
So ausführlich ist der Ausführungsplan, den mir IBExpert anzeigt, auch wieder nicht: Zitat:
Jürgen |
Re: Beschränkung bei GROUP BY wird nicht bemängelt
Zitat:
|
Re: Beschränkung bei GROUP BY wird nicht bemängelt
Hallo,
die von Dir zitierte Information zum Group By meint (vermutlich) etwas in dieser Art:
SQL-Code:
In Deinem Beispiel hast Du zwei Selects und zwei Group By, dies verstößt nicht gegen die genannte Bedingung.
select ID, Kurzbezeichnung, Ort,
( select count(*), mit.Abteilung_id, abt.Id FROM Mitarbeiter mit where mit.Abteilung_id = abt.Id /* Verknüpfung über ForeignKey */ group by mit.Abteilung_id group by abt.Id ) as Anzahl from Abteilungen abt group BY id group BY Kurzbezeichnung group BY Ort; Eventuell ist aber auch die zitierte Information "veraltet", so dass in früheren Versionen geschachtelte Selects mit einem Group By pro Select nicht möglich waren? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz