Kategorien
Programmierung SQL

SQL: Index via Ergebnislisten-Zeilennummer

Die Anforderung: Es soll ein Insert in eine Tabelle erfolgen. Dabei werden die einzufügenden Daten aus anderen Tabellen zusammengesucht.
Unter Oracle könnte dann z.B. so aussehen:

insert into adressen (name, strasse, plz, ort) 
select benutzer.name, anschrift.strasse, anschrift.plz, anschrift.ort

Jetzt benötigen wir in unserem Beispiel aber einen eindeutigen Index um in die Tabelle ‚adressen‘ schreiben zu können, doch woher nehmen?
Oracle liefert in der Variable ‚rownum‘ für jeden Ergebnissatz die Zeilennummer des Satzes innerhalb der Ergebnismenge mit. Diesen Wert, beginnend bei 1, können wir gut dafür nutzen:

insert into adressen (zeile, name, strasse, plz, ort) 
select rownum, benutzer.name, anschrift.strasse, anschrift.plz, anschrift.ort

Jedoch soll/muß unser Index allerdings an den bereits vorhandenen Sätzen angefügt werden. Dazu ermitteln wir den maximalen vorhandenen Wert und addieren unsere Zeilennummer:

insert into adressen (zeile, name, strasse, plz, ort) 
select rownum+(select max(zeile) from adressen), 
       benutzer.name, anschrift.strasse, anschrift.plz, anschrift.ort

Abschließend fangen wir noch den Fehler ab, den das Subselect verursacht, wenn in der Zieltabelle noch keine Sätze enthalten sind:

insert into adressen (zeile, name, strasse, plz, ort) 
select rownum+(select max(zeile) 
               case when decode(max(zeile),NULL,0,'',0,' ',0,1) = 0 then 0 
               else max(zeile) end 
               from adressen), 
       benutzer.name, anschrift.strasse, anschrift.plz, anschrift.ort

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert