AGB  ·  Datenschutz  ·  Impressum  







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

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 1 von 2  1 2   
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
901 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Firebird 3.0 Order mit Feldname bei Union

  Alt 11. Aug 2021, 22:14
Datenbank: Firebird • Version: 3.0 • Zugriff über: FIREDAC
Hallo Zusammen,

sorry für den blöden Titel.

Ich habe ein Select
Code:
SELECT *
FROM TABLE1

UNION

SELECT *
FROM TABLE2

ORDER BY 18
Ich habe in ein SELECT * mit mehreren Tabellen die über Union gebunden sind. Am Ende soll sortiert werden. Bei Union funktioniert, zumindest nach meinem Wissen die Sortierung über Feldnamen nicht. Ich kann jedoch nach Feldnummer gehen ORDER BY 18.
Das hat leider ein großen Haken. Wenn ich in den Tabellen Felder hinzufügen würde, könnte sich die FeldNr verschieben und zum falschen Ergebnis führen. Der Feldname wäre hier sicherer.

Hat jemand eine Idee?

Gruß Kostas
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.909 Beiträge
 
Delphi 7 Professional
 
#2

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 11. Aug 2021, 22:46
SQL-Code:
select * from (
  SELECT *
  FROM TABLE1
  UNION
  SELECT *
  FROM TABLE2
)
ORDER BY feldname
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.964 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 12. Aug 2021, 06:19
An der Stelle kann man auch sehr schön mit Views arbeiten. (Wie an vielen anderen Stellen auch)
Abgesehen von Aspekten wie Interfacing, diesem Hilfskonstrukt oben und ähnlichen Punkten, bietet ein View bei einem beliebig komplexen Select Statement schon einen Gewinn, wenn es mehr als einmal im Programm aufgerufen wird.
Gruß, Jo
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.005 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 12. Aug 2021, 08:03
Hallo,
sind denn die Feldnamen in den Tabellen gleich?
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
533 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 12. Aug 2021, 08:28
Code:
SELECT *
FROM TABLE1

UNION

SELECT *
FROM TABLE2

ORDER BY 18
Der Feldname wäre hier sicherer.

Hat jemand eine Idee?
Der Feldname ist nicht nur da sicherer, sondern auch da zu benutzen, wo du bisher dir mit * das leben einfach machst

Sobald eine der Tabellen in rdb$relation_fields auch nur eine andere Reihenfolge bekommt, wird dir deine
Konstruktion Felder zusammenbauen, die nix mitienander zu tun haben, kann auch dann zB die Spalte
18 sein, nach der zufälig gerade sortieren willst. Die reihenfolge ändert man zwar nicht zufällig,
aber wenn doch, hast du einen rattenschwanz an problemen. Wenn nur eines der beiden Tabellen neue Felder bekommt,
wird die Anweisung eh fehlerhaft sein und nicht ausgeführt werden können.

Löse am besten das Problem gleich da wo es weit größer werden wird als nur bei dem Komfort. im Order by lesbarere
Namen zu haben.

Interaktiv einfach mal mit select * aubzurufen, was da kommt, ist immer legitim, in einer dauerhaft genutzen
SQL Anweisung sollte das immer vermieden werden.
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
901 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 12. Aug 2021, 09:38
Hallo Holger,

ich wende im normalen Betrieb sehr sehr selten SELECT *. In diesem Fall hat es einen Grund. Es geht um einen Vorgang der alle Daten aller Tabellen bei Neuanlage und Änderung als JSON exportiert. Damit der Exporter immer zuverlässig funktioniert, auch wenn Felder neu hinzugekommen oder entfernt wurden, arbeitet der Prozess mit SELECT * Teilweise sogar generalisiert wobei der Tabellennamen über ein Makro übergeben wird. NUR in ein paar Tabellen habe ich eine Sonderbehandlung. Das UNION bindet ein paar Tabellen mit gleicher Struktur oder dieselbe Tabelle mit unterschiedlichem WHERE. Die Anzahl der Felder sind also immer garantiert identisch und wenn nicht, dann darf es zu einer Exception kommen, denn dann habe ich geschlafen.

Gruß Kostas
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
901 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 12. Aug 2021, 09:39
Hallo,
sind denn die Feldnamen in den Tabellen gleich?
Ja, alle Selects des UNION haben dieselbe Struktur. Dafür sorge ich... normalerweise

Gruß Kostas
  Mit Zitat antworten Zitat
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.258 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 12. Aug 2021, 10:50
Ich nache da immer noch ein

Code:
Select Feldliste from (
  DeinUnionSelect
)
order by ...
drumrum. (Derived tables)

Frank

, der wurde ja bereits erwähnt...
Frank Reim

Geändert von dataspider (12. Aug 2021 um 10:54 Uhr)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
901 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Firebird 3.0 Order mit Feldname bei Union

  Alt 12. Aug 2021, 11:01
Ich nache da immer noch ein

Code:
Select Feldliste from (
  DeinUnionSelect
)
order by ...
drumrum. (Derived tables)

Frank

, der wurde ja bereits erwähnt...
Hallo Frank,

perfekt genau so funktionierts.

Code:
SELECT * FROM (
   SELECT *
   FROM TABLE1

   UNION

   SELECT *
   FROM TABLE2
)

ORDER BY FELDNAME
Tausend Dank.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.909 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
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf