Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Union Select und ORDER BY (https://www.delphipraxis.net/69604-union-select-und-order.html)

Hansa 17. Mai 2006 19:07

Datenbank: FB 1.5 • Zugriff über: egal

Union Select und ORDER BY
 
Moin,

habe eine Tabelle. Nach 3 Kriterien sollen Daten ermittelt werden. Diese sollen in eine Datenmange, allerdings sortiert. Am besten erkläre ich es nicht so abstrakt. Es geht um Lieferung/Rücknahme. Vom Prinzip her müßte es mit Union gehen, weil es sich wie gesagt um eine Tabelle handelt. Die drei Teile sollen so aussehen (sollen auch in dieser Reihenfolge erscheinen) : 1. Lieferung : sortiert nach Art.Nr. 2.,3. : Rückgabe. Der Unterschied besteht darin, um welche Art.Nr. es sich handelt. Also in 2. z.B. alle DS > 1000 und in 3. die anderen. Rückgaben sind zur Unterscheidung durch ein Flag gekennzeichnet. Nun kommt es mir so vor, als könne man zwar am Ende des Union ein Order By machen, aber nicht für die 3 Teile einzeln. Ist da ein Fehler drin, oder geht das nur so ?

mkinzler 17. Mai 2006 19:18

Re: Union Select und ORDER BY
 
Ja, ein globales GROUP BY für alle Teile geht nicht. Da mußt du wohl ne SP schreiben oder FB2 verwenden, da kann man PL auch in "normalen" Queries verwenden.

Hansa 17. Mai 2006 19:51

Re: Union Select und ORDER BY
 
Wie SP schreiben ? Was wäre denn da anders ? :shock: Und PL ? Was ist das ? FB2 sollte mittlerweile kein Hindernis mehr sein.

mkinzler 17. Mai 2006 19:56

Re: Union Select und ORDER BY
 
Zitat:

Zitat von Hansa
Wie SP schreiben ?Was wäre denn da anders ? :shock:

Die 3 Abfragen nacheinander in der SP ausführen, dann kannst du Im Programm ein ORDER BY auf das Ergebnis machen.
Zitat:

Und PL ? Was ist das ?
Procedure Language
Zitat:

FB2 sollte mittlerweile kein Hindernis mehr sein.

TBx 17. Mai 2006 20:56

Re: Union Select und ORDER BY
 
Hallo Hansa!

Das ließe sich vermutlich mit berechneten Feldern machen.
Poste doch mal die Tabellenstruktur und ein paar Beispieldaten.
Dann versuche ich gerne mal, sowas zusammenzubasteln.

Gruß


Onlinekater

Hansa 17. Mai 2006 21:26

Re: Union Select und ORDER BY
 
Beispieldaten wird zu kompliziert oder ich müßte sehr einfache konstruieren. Gehe mal hiervon als gewünschtem Ergebnis aus :

Code:
Nr.     zurueck (0 : Nein, 1 : Ja)
1        0  // nur nach Nr., sofern 0
1001     0
1002     0
1001     1  // Rückgabe Nr. > 1000
1002     1 
2        1  // Rückgabe, aber jetzt erst zeigen weil Nr. < 1000
Vielleicht kam auch die Frage nicht präzise genug rüber. Die Überlegung geht dahin, es mit dem UNION zu machen, aber geht die Sortierung (also nacheinander nach den Kriterien aus Bsp.) damit ? Also : sofern zurueck = 0 nur Sortierung nach Nr. interessiert, falls zurueck = 1, dann die zwei in Frage kommenden Nr.-Kreise zusammenhängend auflisten. Siehe oben : Nr. >= 1000 zuerst und dann die mit Nr. < 1000.

@mkinzler : an SP habe ich bei der Sache hier noch gar nicht gedacht. Wie meinst Du das genau ? Bräuchte einen fetzen SQL-Beispielcode.

alex517 17. Mai 2006 21:28

Re: Union Select und ORDER BY
 
Hi Hansa,

wenn ich dich richtig verstehe, möchtest du nach Artikel-Nr sortieren aber die genannte Reihenfolge
der Lieferung/Rücklieferung beibehalten. Dein Problem ist jetzt, dass die Sortierung nach Artikel-Nr
über alle mit UNION verbundenen Abfragen die gewünschte Reihenfolge wieder durcheinander würfelt.
Eben alles nur nach Artikel-Nr sortiert.
Um die Datensätze nach UNIONs + Artikel-Nr sortiert zu erhalten, muß in jede Abfrage eine Konstante
eingefügt werden, welche in die ORDER By Klausel mit aufgenommen wird.

SQL-Code:
select 1 as Reihenfolge, ArtikelNr, ... from ..
union
select 2 as Reihenfolge, ArtikelNr, ... from ..
union
select 3 as Reihenfolge, ArtikelNr, ... from ..
order by Reihenfolge, ArtikelNr
alex

omata 17. Mai 2006 21:31

Re: Union Select und ORDER BY
 
SQL-Code:
SELECT 1 typ, nr, ...
FROM tabelle
WHERE ds > 1000
  AND flag <> 1

UNION

SELECT 2 typ, nr, ...
FROM tabelle
WHERE ds <= 1000
  AND flag <> 1

UNION

SELECT 3 typ, nr, ...
FROM tabelle
WHERE flag = 1

ORDER BY typ, nr

mkinzler 17. Mai 2006 21:51

Re: Union Select und ORDER BY
 
Ab FB2 kann man das auch mit Hilfe von Derived-Queries lösen:
SQL-Code:
select * from ( select * from tabelle where <bed1> union select * from tabelle where <bed2> union select * from tabelle where <bed2>) order by <feld>;

Hansa 17. Mai 2006 22:11

Re: Union Select und ORDER BY
 
Gibts das ? Sind das etwa schon Antworten auf mein letztes Posting von kurz vorher ? :shock: Das wäre echt phänomenal, zumindest bei der Frage. :-D

Ohne es zu testen würde ich sagen : so geht das tatsächlich. Dann noch 2 Antworten, die wohl auf Anhieb gehen. :thumb:

Habe beim suchen das hier noch gefunden :

SQL-Code:
SELECT ename "Name", deptno "Abteilung" FROM emp WHERE deptno = 10 
UNION
SELECT ename, deptno FROM emp WHERE deptno = 30 ORDER BY 1;
Kann mir da noch einer erklären, was das "order by 1" für einen Zweck hat ?

Wie, roter Kasten auch noch ? Wißt Ihr, daß ich somit zu einer Nachtschicht verdonnert bin ? Das da wird jetzt noch zuende gebracht. :zwinker:

mkinzler 17. Mai 2006 22:16

Re: Union Select und ORDER BY
 
Zitat:

@mkinzler : an SP habe ich bei der Sache hier noch gar nicht gedacht. Wie meinst Du das genau ? Bräuchte einen fetzen SQL-Beispielcode.
Zur Vollständigkeit:
SQL-Code:
begin
  for select * from <tabelle> where <bed1> order by <feld> into :feld1, feld2, ... do
  begin
  suspend;
  end
  for select * from <tabelle> where <bed2> order by <feld> into :feld1, feld2, ... do
  begin
  suspend;
  end
end

Hansa 18. Mai 2006 01:36

Re: Union Select und ORDER BY
 
Verdammt, komme nicht zum Ende. Wird wohl doch jetzt nichts mehr. Es sei denn einer ist noch da. 8)

SQL-Code:
SELECT 1 as REIHENFOLGE,A.NR AS ANR, A.BEZ FROM REC8 R JOIN ART8 A ON A.ID=R.ID_ART WHERE ID_RECKOPF = 93
UNION
SELECT 2 as REIHENFOLGE,A.NR AS ANR, A.BEZ FROM REC8 R JOIN ART8 A ON A.ID=R.ID_ART WHERE ID_RECKOPF = 93
UNION
SELECT 3 as REIHENFOLGE,A.NR AS ANR, A.BEZ FROM REC8 R JOIN ART8 A ON A.ID=R.ID_ART WHERE ID_RECKOPF = 93
ORDER BY REIHENFOLGE, ANR
Wo liegt nun der Unterschied zu dem Code von Omata und der Nomenklatur von Alex, oder was fehlt ?

Zitat:

Zitat von IBExpert
invalid ORDER BY clause.

Die Ergebnismenge scheint aber zu stimmen, sofern das Order by weggelassen wird kommt auch Ergebnis..

alex517 18. Mai 2006 07:55

Re: Union Select und ORDER BY
 
Zitat:

Zitat von IBExpert
invalid ORDER BY clause.

Entschuldigung, mein Fehler. In der ORDER BY Klausel, zumindest bei FB 1.x, können keine
Feldnamen angegeben werden. Stattdessen muß man die Nummer der Feldes angeben.

SQL-Code:
SELECT 1 as REIHENFOLGE,A.NR AS ANR, A.BEZ FROM REC8 R JOIN ART8 A ON A.ID=R.ID_ART WHERE ID_RECKOPF = 93
UNION
SELECT 2 as REIHENFOLGE,A.NR AS ANR, A.BEZ FROM REC8 R JOIN ART8 A ON A.ID=R.ID_ART WHERE ID_RECKOPF = 93
UNION
SELECT 3 as REIHENFOLGE,A.NR AS ANR, A.BEZ FROM REC8 R JOIN ART8 A ON A.ID=R.ID_ART WHERE ID_RECKOPF = 93
ORDER BY 1, 2
alex

TBx 18. Mai 2006 08:45

Re: Union Select und ORDER BY
 
@Hansa: Irgendwie ist der Sinn der Unions noch nicht erkennbar, da Du immer die gleiche Where-Clausel einsetzt ....
imho müstest Du über die WHERE-Clauseln entsprechend schlüsseln, um REIHENFOLGE festzulegen.

Gruß

onlinekater

Jelly 18. Mai 2006 12:11

Re: Union Select und ORDER BY
 
Zitat:

Zitat von onlinekater
@Hansa: Irgendwie ist der Sinn der Unions noch nicht erkennbar, da Du immer die gleiche Where-Clausel einsetzt ....

Das seh ich genauso... Ich würd die Query eventuell so formulieren

SQL-Code:
SELECT ID_RECKOPF, A.NR AS ANR, A.BEZ FROM REC8 R JOIN ART8 A ON A.ID=R.ID_ART WHERE ID_RECKOPF in (93,94,95)
order by ID_RECKOPF, a.NR

Hansa 18. Mai 2006 12:56

Re: Union Select und ORDER BY
 
Ihr habt lediglich zu wenig Phantasie. :mrgreen: Ich baue mir doch nicht eine komplizierte Logik zusammen, um dann feststellen zu müssen, daß die syntaktisch falsch ist. Das wird allerdings tatsächlich oft so gemacht, aber von mir nicht. :P @Alex : geht jetzt. :thumb: Und mit dieser Grundvoraussetzung gehe ich nun hin und schreibe das richtige SelectSQL mit den richtigen Feldern für das Programm. Da es tatsächlich so geht, was ich vorher ja nur vermutet hatte, wird das noch an anderen Stellen auch so gemacht werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:28 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 by Thomas Breitkreuz