Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

[How-to] Spaltennummerierung, Zeilennummer

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von ukulele, 22 August 2013.

  1. ukulele

    ukulele Datenbank-Guru

    Da ich es selbst immer wieder raus krame hier mal ein unter MS SQL sehr nützlicher Code. Will man per Schleife eine Tabelle oder eine Teilmenge davon durchlaufen die keine Zeilennummerierung (z.B. in Form eines fortlaufenden Integers) hat, kann man sich wie folgt behelfen:

    Code:
    DECLARE    @pk UNIQUEIDENTIFIER,
            @counter INT
     
    SET        @counter = (    SELECT    count(1)
                            FROM    tabelle )
    WHILE    @counter > 0
    BEGIN
        SET        @pk = (    SELECT    pk
                        FROM (    SELECT    TOP (@counter) pk,
                                        ROW_NUMBER() OVER (ORDER BY pk) AS zeilennr
                                FROM    tabelle
                                WHERE  pk = pk -- optionale WHERE-Bedigungen
                                ORDER BY pk ) x
                        WHERE    x.zeilennr = @counter )
     
        SELECT    @pk,
                @counter
     
        SET        @counter -= 1
    END
    Natürlich läßt sich die Sortierung beliebig ändern. Auch läßt sich OVER() für eine simple Zeilennummer nutzen:
    Code:
    SELECT    pk,
            ROW_NUMBER() OVER (ORDER BY pk) AS zeilennr
    FROM    tabelle
    ORDER BY pk
     
    Walter gefällt das.
  2. akretschmer

    akretschmer Datenbank-Guru

    Das sieht nicht nur deutlich angenehmer aus, sondern ist auch so der Weg unter Oraggle und PG und so auch in irgend einer SQL-Spec ...
     
  3. ukulele

    ukulele Datenbank-Guru

    Jetzt hab ich zum selben Thema ein Problem. Ich möchte eine Tabelle sortieren und die Sortierung in die dafür vorgesehene, bereits vorhande aber nicht komplett gefüllte Spalte schreiben.
    Code:
    SELECT    pk,zeilennr
    FROM    kam_zie
    Code:
    SELECT    pk,
            zeilennr,
            (    SELECT    t1.zeilennr_neu
                FROM    (    SELECT    t2.pk,
                                    ROW_NUMBER() OVER (ORDER BY zeilennr) AS zeilennr_neu
                                    FROM    kam_zie t2 ) t1
                            WHERE    t1.pk = kam_zie.pk ) AS asdf
    FROM    kam_zie
    ORDER BY zeilennr
    funktioniert und ergibt:
    Aber wenn ich das ganze per Update mache:
    Code:
    UPDATE    kam_zie
    SET        zeilennr =(    SELECT    t1.zeilennr_neu
                        FROM    (    SELECT    t2.pk,
                                    ROW_NUMBER() OVER (ORDER BY zeilennr) AS zeilennr_neu
                                    FROM    kam_zie t2 ) t1
                        WHERE    t1.pk = kam_zie.pk )
    t1 liefert definitiv nur eine zeilennr_neu pro pk und eine andere Unterabfrage mit = habe ich nicht. Natürlich kann ich jetzt auf eine Hilfsspalte ausweichen aber ich verstehe das nicht so recht.

    PS: Die Fehlermeldung scheint mir nicht sinnig, es scheint mehr das kam_zie.pk in der Unterabfrage nicht funktioniert. Aber auch wenn ich dort eine UUID fest eintrage und die Unterabfrage definitiv funktioniert und nur den Wert 6 liefert läuft das Update Statement nicht. Offensichtlich verändert sich die Tabelle mit jeder Zeile für die das Update Statement ausgeführt wird.
     
    Zuletzt bearbeitet: 27 September 2013
  4. akretschmer

    akretschmer Datenbank-Guru




    Ich würde es so machen und denke, M$SQL kann das auch:

    Code:
    test=*# create table ukulele (id int, nr int);
    CREATE TABLE
    Time: 18,828 ms
    test=*# insert into ukulele (id) select s from generate_Series(1,10) s;
    INSERT 0 10
    Time: 0,444 ms
    test=*# select * from ukulele ;
     id | nr
    ----+----
      1 |
      2 |
      3 |
      4 |
      5 |
      6 |
      7 |
      8 |
      9 |
     10 |
    (10 rows)
    
    Nun das Update:

    Code:
    test=*# with foo as (select id, row_number() over (order by id) as nr from ukulele) update ukulele set nr = foo.nr from foo where ukulele.id=foo.id;
    UPDATE 10
    Time: 0,462 ms
    test=*# select * from ukulele ;
     id | nr
    ----+----
      1 |  1
      2 |  2
      3 |  3
      4 |  4
      5 |  5
      6 |  6
      7 |  7
      8 |  8
      9 |  9
     10 | 10
    (10 rows)
    
     
  5. ukulele

    ukulele Datenbank-Guru

    Bei deiner Lösung bekomme ich exakt den selben Fehler. = foo.id liefert offenbar mehr als einen Wert (das behauptet die Fehlermeldung).

    Ich habe die Sortierung in eine Temp Tabelle geschrieben und nichtmal das läßt sich zurück schreiben:
    Code:
            UPDATE    kam_zie
            SET        zeilennr = (    SELECT    zeilennr
                                    FROM    kam_zie_temp
                                    WHERE    pk = kam_zie.pk )
    Bin ich blöd oder habe ich Update verlernt? Bin ich eigentlich schon wach?
     
  6. akretschmer

    akretschmer Datenbank-Guru


    works for me:

    Code:
    test=*# select * from ukulele ;   
     id | nr   
    ----+----   
      1 |  1   
      2 |  2   
      3 |  3   
      4 |  4   
      5 |  5
      6 |  6
      7 |  7
      8 |  8
      9 |  9
     10 | 10
    (10 rows)
    
    Time: 0,181 ms
    test=*# select * from u2;
     id | nr
    ----+----
      1 |
      2 |
      3 |
      4 |
      5 |
      6 |
      7 |
      8 |
      9 |
     10 |
    (10 rows)
    
    Time: 0,195 ms
    test=*# update u2 set nr = ( select nr from ukulele where id=u2.id);
    UPDATE 10
    Time: 0,371 ms
    test=*# select * from u2;
     id | nr
    ----+----
      1 |  1
      2 |  2
      3 |  3
      4 |  4
      5 |  5
      6 |  6
      7 |  7
      8 |  8
      9 |  9
     10 | 10
    (10 rows)
    
    Time: 0,178 ms
    
     
  7. ukulele

    ukulele Datenbank-Guru

    Es läuft jetzt im Trigger unter zur Hilfenahme einer Temp Tabelle. Also das besagte Update Statement aus meinen Vorpost geht jetzt, ich habe eigentlich nichts verändert nur einen select zum debuggen dazwischen gesetzt und wieder entfernt.
     
Die Seite wird geladen...
Ähnliche Themen - [How Spaltennummerierung Zeilennummer
  1. ukulele
    Antworten:
    0
    Aufrufe:
    3.083

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden