AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Beschränkung bei GROUP BY wird nicht bemängelt
Thema durchsuchen
Ansicht
Themen-Optionen

Beschränkung bei GROUP BY wird nicht bemängelt

Ein Thema von Jürgen Thomas · begonnen am 20. Jul 2009 · letzter Beitrag vom 21. Jul 2009
Antwort Antwort
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#1

Beschränkung bei GROUP BY wird nicht bemängelt

  Alt 20. Jul 2009, 12:09
Datenbank: Firebird • Version: 2.1 • Zugriff über: IBExpert
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 von EmbedSql.pdf:
For each SELECT clause in a query, including subqueries, there can only be one GROUP BY clause.
Unter diesen Umständen verstehe ich nicht, warum folgende Abfrage funktioniert:
SQL-Code:
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;
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.

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 Firebird-Doku gibt es keine Angaben zu dieser Einschränkung.
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Beschränkung bei GROUP BY wird nicht bemängelt

  Alt 20. Jul 2009, 12:46
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;
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#3

Re: Beschränkung bei GROUP BY wird nicht bemängelt

  Alt 20. Jul 2009, 12:59
Zitat von omata:
Was ist jetzt eigentlich dein Problem?
Zitat von Jürgen Thomas:
Vielmehr versuche ich, ein Beispiel zu konstruieren, das zu einer bestimmten Bedingung passt bzw. diese Bedingung verletzt.
Ich hatte gedacht, dass mein Beispiel dazu passt. Aber es könnte natürlich sein, dass Firebird intelligent genug ist und alles Überflüssige entfernt.

So ausführlich ist der Ausführungsplan, den mir IBExpert anzeigt, auch wieder nicht:
Zitat:
Plan:
PLAN (MIT ORDER MITARBEITER_FK INDEX (MITARBEITER_FK))
PLAN SORT ((ABT NATURAL))

Adapted plan:
PLAN (MIT ORDER MITARBEITER_FK INDEX (MITARBEITER_FK)) PLAN SORT ((ABT NATURAL))
Wie gesagt: ich weiß, wie ich ein gewünschtes Ergebnis bekomme. Ich suche ein Beispiel, das die Bedingung verletzt; und mein Beispiel ist es leider (so?) nicht.

Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Beschränkung bei GROUP BY wird nicht bemängelt

  Alt 20. Jul 2009, 13:25
Zitat:
For each SELECT clause in a query, including subqueries, there can only be one GROUP BY clause.
Vielleicht ist die Bedingung einfach zu sehr aus dem Zusammenhang gerrissen. Mir fällt da auch kein konkretes Beispiel ein, sorry.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

Re: Beschränkung bei GROUP BY wird nicht bemängelt

  Alt 21. Jul 2009, 11:18
Hallo,

die von Dir zitierte Information zum Group By meint (vermutlich) etwas in dieser Art:
SQL-Code:
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;
In Deinem Beispiel hast Du zwei Selects und zwei Group By, dies verstößt nicht gegen die genannte Bedingung.

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?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz