AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Oracle LAG/LEAD Funktion falsche Sortierung?
Thema durchsuchen
Ansicht
Themen-Optionen

Oracle LAG/LEAD Funktion falsche Sortierung?

Ein Thema von David Martens · begonnen am 12. Okt 2010 · letzter Beitrag vom 12. Okt 2010
Antwort Antwort
David Martens

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

Oracle LAG/LEAD Funktion falsche Sortierung?

  Alt 12. Okt 2010, 12: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 12:21 Uhr) Grund: Code-Tag durch SQL-Tag ersetzt
  Mit Zitat antworten Zitat
David Martens

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

AW: Oracle LAG/LEAD Funktion falsche Sortierung?

  Alt 12. Okt 2010, 15:01
Jetzt hab ich das Problem gelöst:

SQL-Code:
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;
Im Subselect wird einmalig und richtig die Sortierung festgelegt und kann somit von der LAG Funktion nicht mehr durcheinander gebracht werden.

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


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