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
 
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#9

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 12. Aug 2021, 10:09
Das UNION bindet ein paar Tabellen mit gleicher Struktur oder dieselbe Tabelle mit unterschiedlichem WHERE.
Dann spricht absolut nichts dagegen, auf den Stern zu verzichten und die Spalten aufzuführen, das geht dann sogar per Copy&Paste.

Grundsätzlich halte ich die Nutzung von Select * in Programmen (egal mit welcher Begründung) für fahrlässig.
SQL-Code:
SELECT Spalte1, Spalte2, und, weitere, Spalten
FROM TABLE1

UNION

SELECT Spalte1, Spalte2, und, weitere, Spalten
FROM TABLE2

ORDER BY Und
funktioniert unter FireBird nicht.

Da müsste es korrekterweise dann eher
SQL-Code:
SELECT Spalte1, Spalte2, und, weitere, Spalten from (
  SELECT Spalte1, Spalte2, und, weitere, Spalten
  FROM TABLE1
  UNION
  SELECT Spalte1, Spalte2, und, weitere, Spalten
  FROM TABLE2
)
ORDER BY Und
heißen.

Ändern sich (warum auch immer) mal die Spalten in einer der Tabellen und nehmen wir an, dass es sich immer um Spalten vom Typ Integer handelt, dann funktioniert bei einem * im Select auch sinngemäß sowas:
SQL-Code:
SELECT Sum(Spalte1) as A, Sum(Spalte2) as b, Sum(und) as c, Max(weitere) as d, Spalten from (
  SELECT Spalte1, Spalte2, und, weitere, Spalten
  FROM TABLE1
  UNION
  SELECT und, Spalte1, weitere, Spalte2, Spalten
  FROM TABLE2
)
Group by a,b,c,d
ORDER BY Spalten
Das Gleiche mit Stern
SQL-Code:
SELECT Sum(Spalte1) as A, Sum(Spalte2) as b, Sum(und) as c, Max(weitere) as d, Spalten from (
  SELECT *
  FROM TABLE1
  UNION
  SELECT *
  FROM TABLE2
)
Group by a,b,c,d
ORDER BY Spalten
wird auch funktionieren.

Das kann dann durchaus auch mal in eine Art "Zufallsgenerator" ausarten, bei dem man zwar merkt, dass das Ergebnis irgendwie nicht hinhaut, aber bei der Ursachenforschung wird das dann verdammt haarig.

Und wenn "on the fly" bei unterschiedlichen Datentypen an einer bestimmten Spaltenposition von der Datenbank eine Typkonvertierung erfolgen kann, dann funktioniert das Konstrukt via Select * immer noch.
SQL-Code:
SELECT VarChar, VarChar, Integer, VarChar, Integer from (
  SELECT VarChar, VarChar, Integer, VarChar, Integer FROM TABLE1
  UNION
  SELECT Integer, Integer, Integer, Integer, Integer FROM TABLE2
  UNION
  SELECT VarChar, VarChar, VarChar, VarChar, VarChar FROM TABLE3
)
ORDER BY Und
wird datenbankseitig problemlos verarbeitet.

Nur bei unterschiedlichen Spaltenzahlen wird es einen Fehler geben.

Auf ein
Zitat von Kostas:
Dafür sorge ich... normalerweise
verlasse ich mit grundsätzlich nicht

Oder anders formuliert: Ein Select * in einem Programm geht grundsätzlich nicht durch die Qualitätsprüfung.

Geändert von Delphi.Narium (12. Aug 2021 um 10:15 Uhr) Grund: Schreibfehler ...
  Mit Zitat antworten Zitat
 


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 13:19 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