1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
/* Nummeriere die Datensätze ************************* Gegeben sei eine Tabelle aysx mit einem Primary Key. Die Werte für den PK müssen nicht fortlaufend sein. Aufgabe: Nummeriere die Datensätze vom kleinsten bis zum größsten PK-Wert. Das folgende MySQL-Script zeigt exemplarisch, wie das machbar ist. Bedenke, dass die Bestimmung des Rangs (gidf) nicht auf eine "echte" Tabelle beschränkt ist, sondern auch mit einem View und dem Ergebnis einer Abfrage durchgeführt werden kann. Beispieltext: aysx Matthias Kopp 2013 */ create table aysx ( id int PRIMARY KEY, remark varchar ( 64 )); /* Tabelle mit Beispieldaten füllen. */ insert into aysx ( id, remark ) values ( 1, 'Eins' ); insert into aysx ( id, remark ) values ( 512, 'FiveOneTwo' ); insert into aysx ( id, remark ) values ( 21, 'Antv' ); insert into aysx ( id, remark ) values ( 42, 'Antwort' ); insert into aysx ( id, remark ) values ( 23, 'whatever' ); /* Wesentlich ist der self-join. Der PK-Constraint garantiert, dass jede aysx.id nur einmal vorkommt. Eine id ist immer gleich ihrer selbst und alle anderen sind entweder größer oder kleiner. Die where-Bedingung sucht diejenigen Datensätze zusammen, die kleiner-gleich einer id sind - und das für alle ids. Schließlich wird für jede id eine Gruppe gebildet und die Anzahl der Elemente in der Gruppe ist eben der Rang. */ select count(*) as rang, t2.id from aysx t1, aysx t2 where t1.id <= t2.id group by t2.id; /* Ohne Gruppierung und Zählen - die "expandierte" Form. Hier kann man nachvollziehen, welche Elemente vorhanden sind. Zähle und gruppiere selbst! */ select t1.id, t2.id from aysx t1, aysx t2 where t1.id <= t2.id order by t2.id /* Auräumen. */ drop table aysx; |
Natürlich ist das obige Beispiel so in der Praxis nicht vorgekommen. Das Beispiel zeigt eine nützliche Struktur. Im Laufe der Zeit kam immer wieder die Anforderung der Durchnummerierung. Man braucht dazu keinen PK-Constraint, aber wenigstens irgendein Tupel, das unique ist – und das findet sich. Jedenfalls konnte ich immer irgendwo eins auftreiben :)
Das Script oben habe ich mit Copy&Paste aus SQuirreL SQL übernommen, während ich mit einer MySQL-Datenbank verbunden war. Kann sein, dass andere RDBMS eine leicht abweichende Syntax haben. Aber im Prinzip sollte dieses Script auf gängigen SQL-Systemen lauffähig sein.