Einzelnen Beitrag anzeigen

David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#1

Oracle LAG/LEAD Funktion falsche Sortierung?

  Alt 12. Okt 2010, 11:18
Datenbank: Oracle • Version: 9 • Zugriff über: odbc
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

Geändert von mkinzler (12. Okt 2010 um 11:21 Uhr) Grund: Code-Tag durch SQL-Tag ersetzt
  Mit Zitat antworten Zitat