Insert

Hallo zusammen
Hat einer von euch jemals mit einem query folgendes geschafft:

NRPAR00 CDKUK00 NRPRD00 NRVVG00
300698 01-00-000000-00 1000 13245997112
300698 09-00-000000-00 1001 13345987112
300699 01-00-000001-05 1000 13845927112
300699 09-00-000001-05 1001 13146597872

NRPAR00 = Partnernummer
CDKUK00 = code kundenkonto
NRPRD00 = nummer produkt kundenkonto
NRVVG00 = interne kundenkonto nummer

Nun möchte ich jedem der ein NRPRD00 1000 und NRPRD00 1001 hat, ein neues inserten mit der nummer 1002. Das würde ich ja noch schaffen, aber der NRVVG00 sollte immer um 1 erhöht werden. Es sollte also folgendermassen aussehen:

NRPAR00 CDKUK00 NRPRD00 NRVVG00
300698 01-00-000000-00 1000 13245997112
300698 09-00-000000-00 1001 13345987112
300698 07-00-000000-00 1002 66666666666 (höchste freie nummer)
300699 01-00-000001-05 1000 13845927112
300699 09-00-000001-05 1001 13146597872
300699 07-00-000001-05 1002 66666666667 (höchste freie nummer)
usw.

Ich scheitere immer daran, dass ich den NRVVG00 nicht automatisch um 1 erhöhen kann.

Hallo,

Das kommt darauf an, was du unter „höchste freie Nummer“ verstehst.

a) es ist die VOR dem Select größte Nummer + 1. Diese Nummer ist für alle neuen Datensätze gleich. Das geht mit einem inneren Select:

nrvvg00 = (SELECT max(nrvg00) from tabelle)

b) es sollen aufsteigende Nummern vergeben werden. Jeder neue Datensatz erhält eine um 1 größere Nummer: Das geht NICHT in einem Einzeiler. Dazu musst du eine Prozedur bemühen.

Grund: die Serialisierbarkeit von Historien. Bei der Prozedur erzeugst du eine Ordnung (mindestens formal, beim Select eben gerade nicht. Das Ergebnis wäre zufällig. Es gilt der Zustand zum Zeitpunkt des Selects.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]