Schrittweises erhöhen von Werten

Dr_Doom

Mitglied
Guten Morgen,

ich habe folgendes Problem:

ich habe eine Tabelle, bestehend aus 3 Spalten. 2 davon sind mit ID´s gefüllt, die dritte enthält einen numerischen Wert (im Moment 1 für alle Werte der Tabelle).

ID1 | ID2 | Zahl

ID1 ist eindeutig, kann aber mehrere ID2s enthalten. In einem solchen Fall soll das Feld Zahl pro vorkommender ID2 um den Wert '1' erhöht werden.

also das Ergebnis sollte z.Bsp. dann so aussehen (Spaltenreihenfolge ID1, ID2, ZAHL).

1 | 2 | 1
1 | 5 | 2
1 | 7 | 3
2 | 2 | 1
 
Hi und noch ein ein gesundes Neues

Also:
Bei dir ist keine der 3 Spalten eindeutig. Wenn dann nur ID1 und ID2 gemeinsam.
Um aber die Anzahl der Einträge in Spalte 1 zu bekommen, musst du das nicht in die Datenbank schreiben. SQL bietet eine praktische Funktion namens COUNT an ;)

Bsp.:
SQL:
SELECT ID1, COUNT(*) AS Anzahl FROM table WHERE ID1 = 1
 
ich muss es aber in die datenbank schreiben, es handelt sich hier um CAD Beschriftungen für Objekte eines GIS, gibt es mehrere schriften pro objekt hat jede eine eigene id (die ID2) sowie eine folgenummer (hier ZAHL), diese muss 1-n beinhalten, damit die beschriftung korrekt zu der ObjektID zugeordnet wird

die Anzahl mit Count ist längst ermittelt, aber das bringt mich nicht weiter :-(

ja, ich weiß, dieses Konstrukt ist antiquiert und auch nicht besonders performant, aber so ist das nunmal hier in der Firma :-)
 
Das Problem mit kranken Lösungen kenn ich. So was gibt's überall ;)

topic:
Du könntest dir einen Trigger schreiben, der beim Insert das Feld automatisch füllt.
 
ich habe die Daten über ein LISP Konstrukt in die Datenbank (Oracle) geholt, das ZAHL Feld ist im Moment überall 1.
Also soll ich den Insert erneut ausführen und dabei dann das ZAHL-Feld automatisch erhöhen ?
In Bezug auf Trigger hab ich kaum Ahnung, da muss erstmal die Referenz ran :-)
 
Richtig, mit dem Trigger wird das Feld automatisch gefüllt.
Die Inserts musst du erneut durchführen, um das Feld zu füllen Du könntest zwar alternative ein Skript laufen lassen, dass das Feld füllt. Dabei ist aber nicht garantiert, dass die ID-Paare dann auch den richtigen Wert erhalten, da du nichts hast, um die Datensätze historisch zu sortieren.
(Die Oracle-Gurus mögen mich jetzt bitte korrigieren, falls die Datensätze doch in der Reihenfolge ihres Anlegens zurückgegeben werden. Aber bitte nicht zu sehr schlagen :D )
 
Hab ich das richtig verstanden? Deine Tabelle sieht momentan so aus:
SQL:
       ID1        ID2       ZAHL
---------- ---------- ----------
         1          2          1
         1          5          1
         1          7          1
         2          2          1
Und sie soll so aussehen?
SQL:
SQL> select id1, id2, row_number() over( partition by id1 order by id2) from t;

       ID1        ID2 ROW_NUMBER()OVER(PARTITIONBYID1ORDERBYID2)
---------- ---------- ------------------------------------------
         1          2                                          1
         1          5                                          2
         1          7                                          3
         2          2                                          1

Ist die Reihenfolge der ID2 relevant? Also wird die ID2 größer pro INSERT?
 
Zuletzt bearbeitet von einem Moderator:
Hallo Exceptionfault,

die Reihenfolge der ID2 ist egal, sie wird nicht unbedingt größer per insert, dein select trifft nach ein paar umstellungen genau den Nagel auf den Kopf und lässt den gestrigen Frust verfliegen, ich danke vielmals !
 
Zurück