Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#10

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 12. Aug 2021, 11: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 11:15 Uhr) Grund: Schreibfehler ...
  Mit Zitat antworten Zitat