![]() |
Datenbank: Oracle • Version: 9 • Zugriff über: odbc
Oracle LAG/LEAD Funktion falsche Sortierung?
Folgendes vereinfachtes Problem:
Tabelle1: Spalten: Baustein, Funktion (beide VARCHAR/VARCHAR2) LfdNrA (integer) Tabelle2: Spalten: Name (VARCHAR/VARCHAR2) LfdNrB (integer) LfdNrA (aus Tabelle 1) ----------------------------------------------- Hier die SQL:
SQL-Code:
-----------------------------------------------
for fkt_rec in (
select Baustein, LAG(Baustein, 1) over (order by Baustein, Funktion, Name) "PreBaustein", Funktion, LAG(Funktion, 1) over (order by Baustein, Funktion, Name) "PreFunktion", Name from Tabelle1, Tabelle2 where Tabelle1.LfdNrA = Tabelle2.LfdNrA -- Das order by ist anders als in der LAG Funktion order by Baustein, Funktion, Name ) loop if fkt_rec."PreBaustein" is null then dbms_output.put_line('--////////////////////////////////////////////////////////////////////////////////'); dbms_output.put_line('-- ' || fkt_rec.Baustein); end if; if fkt_rec.Baustein <> fkt_rec."PreBaustein" then dbms_output.put_line(''); dbms_output.put_line('--////////////////////////////////////////////////////////////////////////////////'); dbms_output.put_line('-- ' || fkt_rec.Baustein); end if; if fkt_rec.Funktion <> fkt_rec."PreFunktion" or fkt_rec."PreFunktion" is null then dbms_output.put_line(''); dbms_output.put_line('-- ' || fkt_rec.Funktion); dbms_output.put_line(''); end if; dbms_output.put_line(fkt_rec.Name); end loop; Es ist jetzt so das bei dem "großen" (letzten) order by die Sortierung anders ist als in den LAG Funktionen. Beispiel: (Auszug) Tabelle2.Name: test, test1, test2, test3, Test, Test1, TEst, TEst1, a, b, c, z, +a, +b Die LAG Funktion sortiert so: +a, +b, a, b, c, z, test, test1, test2, test3, Test, Test1, TEst, TEst1 Das "normale" order by: a, b, c, test, Test, TEst, test1, Test1, TEst1, test2, test3, z, +a, +b ----------------------------------------------- Lange Rede kurzer Sinn: 1. Muß ich das "große" order by einfügen weil die "Sortierung" das Daten mit der LAG Funktion ein Nebeneffekt ist? 2. Kann mir jemand sagen wie ich die Sortierung der LAG Funktion "gerichtigen" kann. (mit Lower() wird nur die Groß-/Kleinschreibung gelöst, aber nicht das Problem mit den Sonderzeichen) Danke David |
AW: Oracle LAG/LEAD Funktion falsche Sortierung?
Jetzt hab ich das Problem gelöst:
SQL-Code:
Im Subselect wird einmalig und richtig die Sortierung festgelegt und kann somit von der LAG Funktion nicht mehr durcheinander gebracht werden.
for fkt_rec in (
select Baustein, LAG(Baustein, 1) over (order by rownum) "PreBaustein", Funktion, LAG(Funktion, 1) over (order by rownum) "PreFunktion", Name, rownum from (select Baustein, Funktion, Name, rownum from Tabelle1, Tabelle2 where Tabelle1.LfdNrA = Tabelle2.LfdNrA order by Baustein, Funktion, Name, rownum) order by rownum ) loop if fkt_rec."PreBaustein" is null then dbms_output.put_line('--////////////////////////////////////////////////////////////////////////////////'); dbms_output.put_line('-- ' || fkt_rec.Baustein); end if; if fkt_rec.Baustein <> fkt_rec."PreBaustein" then dbms_output.put_line(''); dbms_output.put_line('--////////////////////////////////////////////////////////////////////////////////'); dbms_output.put_line('-- ' || fkt_rec.Baustein); end if; if fkt_rec.Funktion <> fkt_rec."PreFunktion" or fkt_rec."PreFunktion" is null then dbms_output.put_line(''); dbms_output.put_line('-- ' || fkt_rec.Funktion); dbms_output.put_line(''); end if; dbms_output.put_line(fkt_rec.Name); end loop; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:38 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