AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird 3.0 Order mit Feldname bei Union
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird 3.0 Order mit Feldname bei Union

Ein Thema von Kostas · begonnen am 11. Aug 2021 · letzter Beitrag vom 18. Aug 2021
Antwort Antwort
Seite 2 von 2     12   
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#11

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 13. Aug 2021, 05:27
Die Select * Frage innerhalb einer Union Konstruktion scheint mir sehr schräg. (Es ging ja um das Order by)
Ich bin davon ausgegangen, dass die * Clause lediglich im Beispiel aus Bequemlichkeit aufgeführt wurde und da nebensächlich ist.

Es sieht aber anders aus und ich frage mich wieso.
Ein Union Abfrage ist von "Natur aus" dazu da, eine einheitliche Menge aus unterschiedlich strukturierten Daten zu bilden. Eine unterschiedliche Struktur der Teilmengen führt aber zwangsläufig dazu, dass mit expliziter Angabe von Feldnamen gearbeitet werden muss.
Wenn nicht, gibt es keine unterschiedliche Struktur, dann brauche ich auch kein Union.

Zuerst wäre da die "gleiche Tabelle mit unterschiedlichen Where Clauses", das gehört m.E. in eine Abfrage mit geoderten Where Clauses.

Dann unterschiedliche Tabellen mit gleicher Struktur: das "müffelt" nach "meineDaten2020", "meineDaten2019", meine "DatenLaufendesJahr" usw.
Solche "Konstruktionen" sind am ehesten eine Designschwäche, weil z.B. die Jahresdimension in die Haupttabelle selbst gehört und vermeintliche Vorteile dieser Vorgehensweise auf lange Sicht eine fürchterliche Pfriemelei ergeben, nämlich wenn die Mengen, die eigentlich zusammen gehören an verschiedenen Stellen wieder vereinigt werden müssen. Es ist eine brauchbare Vorgehensweise dafür zu Sorgen, dass einem nie die Arbeit ausgeht und statistische Abfragen und Reports immer den Zweifel in sich tragen, ob auch alle Daten dabei berücksichtigt wurden. Sehr schön am Beispiel besonders, wenn Geschäftsjahr und Datumsjahr nicht deckungsgleich sind.
Häufiges Argument für diese Zerlegung von Tabellen ist auch das Thema Performance. Das sollte aber erst ab deutlich vielen Millionen von Datensätzen tatsächlich relevant werden und wird wenn nötig mit Partitionierung gelöst.

Ein Select * für adhoc Geschichten ist immer okay. Wenn man es systematisch und abgesichert einsetzt, z.B. in bestimmten View Schichten z.B. auch. In einem Union View ist es sehr ungewöhnlich bzw. fraglich.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 13. Aug 2021, 06:36
Wenn nicht, gibt es keine unterschiedliche Struktur, dann brauche ich auch kein Union.

Zuerst wäre da die "gleiche Tabelle mit unterschiedlichen Where Clauses", das gehört m.E. in eine Abfrage mit geoderten Where Clauses.
"geodert" musste ich zweimal lesen
Du hast offensichtlich noch nicht mit großen Datenmengen gearbeitet, die im "where" ein "or" benötigen. Genau in solchen Fällen ist ein "union" (besser ein "union all") mit der/den selben Tabelle(n) durchaus sinnvoll, um Performance-Probleme zu vermeiden.
Aber auch dann halte ich ein "select *" nicht für sinnvoll.
Peter

Geändert von Jasocul (13. Aug 2021 um 12:10 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#13

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 13. Aug 2021, 08:03
Wäre denn da dann nicht eher ein "Union All" sinnvoller?

Union sortiert und entfernt Duplikate.

Union All hängt die Ergebnisse einfach aneinander und ist dadurch auch schneller.

Und wenn ich eine Tabelle mit unterschiedlichen Whereklauseln habe, sollte es keine Duplikate geben, wenn doch, hab' ich eher ein Logikproblem in den Wherebedingungen, als die Erfordernis, diese Duplikate per Union zu entfernen.

Die Verwendung von Union ist bei mir eben ebenso fraglich, wie ein Distinct in einem unvollständig ausformulierten Join, der dadurch zu Dubletten führt.

Und ja: Für beide Konstrukte, Union und Distinct, gibt es zuweilen Ausnahmesituationen, in denen deren Verwendung sinnvoll sein kann. Aber bitte immer erst dann, wenn es anders nicht geht. Erfahrungsgemäß ist "es geht auch ohne" auch performanter, da die Datenbank nicht erst mehr oder weniger große Datenmengen zusammensuchen und die dann anschließend auf Eindeutigkeit trimmen muss.

Bei kleinen Datenmengen mag das nicht unbedingt ins Gewicht fallen, bei etlichen dutzend Millionen Datensätzen freut sich der Temptablespace dann aber schon über eine geringere Belastung, derweil, dort fängt es dann an, deutlich in Richtung "suboptimale" Performanz zu gehen.
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 13. Aug 2021, 11:00
Wäre denn da dann nicht eher ein "Union All" sinnvoller?
Das sehe ich genau so...
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 13. Aug 2021, 12:08
Wäre denn da dann nicht eher ein "Union All" sinnvoller?
Stimmt. Wenn schon, dann "union all". Ist bei mir auch immer so, wenn solche Abfragen erstellt werden müssen.
Peter
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#16

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 13. Aug 2021, 16:31
Wenn nicht, gibt es keine unterschiedliche Struktur, dann brauche ich auch kein Union.

Zuerst wäre da die "gleiche Tabelle mit unterschiedlichen Where Clauses", das gehört m.E. in eine Abfrage mit geoderten Where Clauses.
"geodert" musste ich zweimal lesen
Du hast offensichtlich noch nicht mit großen Datenmengen gearbeitet, die im "where" ein "or" benötigen. Genau in solchen Fällen ist ein "union" (besser ein "union all") mit der/den selben Tabelle(n) durchaus sinnvoll, um Performance-Probleme zu vermeiden.
Aber auch dann halte ich ein "select *" nicht für sinnvoll.
geodert, ja, keine Geographie. Das nächste Mal nehm ich ein Bindestrich dazu

Naja, was ist groß? 2 stellige Millionenwerte ist mein Erfahrungshorizont, was Systene angeht, an denen ich entwickelt habe, ohne solche Konstruktionen, noch zu HDD Zeiten.
Und ich wüsste nicht, warum eine Engine ein OR schlechter behandeln sollte als ein Union (all).

Ich kann es auch anders formulieren:
Bevor man zu sowas greift, sollte man gründlich überlegen, welchen Aufwand es nach sich zieht (Codepflege), welche Risiken (Lücken in der Codepflege) und welche anderen Maßnahmen man ergreifen kann (Partitioning, Tuning, Optimizer Hints, ..) Kommt ja alles sicher auch etwas auf den Anbieter (oder Version) des DB Sstems an. Und nur ums explizit zu sagen: Partitioning ist ja im Prinzip eine Art Union All, nur es erlaubt logisch einen transparenten Zugriff, trotz interner Aufteilung der Tabelle nach irgendwelchen Kriterien. Wenn die DB das kann, warum soll ich es dann zu Fuß machen?
Gruß, Jo
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
563 Beiträge
 
Delphi XE6 Enterprise
 
#17

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 16. Aug 2021, 11:35
Man kann ja auch im Vorfeld die Feldliste holen und testen, ob gleich:
(oder halt die SQL-Anweisung als String zusammenbauen und ausführen)
Code:
SET TERM ^;

CREATE OR ALTER PROCEDURE sp_get_columns

  tablename VARCHAR(30),
  uppercase BOOLEAN = true
)
RETURNS
(
  feldliste VARCHAR(2000)
)
AS
  DECLARE feldname VARCHAR(40) = '';
BEGIN
  feldliste = '';
  FOR SELECT rdb$field_name FROM rdb$relation_fields
      WHERE UPPER(rdb$relation_name) = UPPER(:tablename)
      ORDER BY rdb$field_position
  INTO :feldname
  DO BEGIN
    IF (feldliste <> '') THEN feldliste = feldliste || ',';
    feldliste = feldliste || TRIM(feldname);
  END
  IF (NOT uppercase) THEN feldliste = LOWER(feldliste);
END^

SET TERM ;^
  Mit Zitat antworten Zitat
kettyedith

Registriert seit: 18. Aug 2021
1 Beiträge
 
#18

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 18. Aug 2021, 09:44
The column name appears in an aggregate function call select from rdb$collations order by 3, 2.Being able to order the results of a UNION query using "field names" [CORE1505] #1920. Open.So you only use UNION ALL to avoid sorting if you know that there are no duplicate rows in the tables). Everything new in Firebird SQL since InterBase 6. Paul Vinkenoog et al. ... Views can infer column names from derived tables or GROUP BY.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22:02 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