Registriert seit: 27. Nov 2017
2.490 Beiträge
Delphi 7 Professional
|
AW: Firebird 3.0 Order mit Feldname bei Union
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 ...
|