2017-04-07 4 views
0

Ich habe eine Tabelle, die Untersätze von Datensätzen für eine übergeordnete Tabelle hat. Jede Untergruppe hat eine Reihenfolge, die in einem Feld [rank] gespeichert ist. Ich muss dieses Feld für eine bestimmte Untergruppe in dieser Tabelle aktualisieren, basierend auf einer neuen Bestellung im Feld otherRank.T-SQL - Aktualisieren einer Teilmenge von Datensätzen durch Row_Number()

Hat die folgende Abdeckung es:

update mytable t1 set 
[rank] = t2.new_rank_num 
from (select t2.id, new_rank_num = row_number() over (order by t2.otherRank) 
    from mytable t2 where t2.parentID = 628) t2 
where t1.id = t2.id 

oder würde ich brauche:

update mytable t1 set 
[rank] = t2.new_rank_num 
from (select t2.id, new_rank_num = row_number() over (order by t2.otherRank) 
    from mytable t2 where t2.parentID = 628) t2 
where t1.id = t2.id and t1.parentID = 628 

Meine konkrete Frage ist, ich will nicht, etwas außerhalb des Aufgabengebiets von parentID 628 aktualisiert

Bearbeiten Ich bekomme einen Fehler, wenn Sie versuchen, dies auszuführen:

falsche Syntax in der Nähe von t1 falsche Syntax in der Nähe von t2

so muss ich die Syntax zu denken sein:

update mytable set 
    [rank] = t2.new_rank_num 
    from (select id, new_rank_num = row_number() over (order by otherRank) 
from mytable where parentID = 628) t2 
where id = t2.id and parentID = 628 

bearbeiten 2

OK, ich Ich habe dafür eine CTE-Lösung verwendet, wie von SqlZim empfohlen. Es sieht wie folgt aus:

;with cte as (
    select t2.id, new_rank_num = row_number() over (order by t2.otherRank) 
    from mytable t2 where t2.parentID = 628 
) 

update t1 set 
    [rank] = t2.new_rank_num 
from mytable t1 
inner join cte t2 on t1.id = t2.id 
+2

Was passiert, wenn Sie es versuchen? –

+0

Ich habe es zwar noch nicht ausprobiert, da ich in erster Linie ein paar Tipps zur Abfragesyntax benötigte. – scgough

+0

Ich sehe nichts, das mit der Syntax grell falsch ist. Wenn es das gewünschte Ergebnis bringt, geh mit ihm. –

Antwort

3

Ich ziehe diese Art der Sache zu tun mit einem common table expression (cte):

;with cte as (
    select * 
    , new_rank_num = row_number() over (
     partition by ParentId 
     order by otherRank 
     ) 
    from mytable 
) 
update cte 
set [rank] = new_rank_num 
where ParentID = 628; 

Wenn Sie die Änderungen in der Vorschau anzeigen möchten, bevor das Update ausgeführt wird, sondern nur die oben auf eine Änderung select anstelle einer update. Beachten Sie, dass nur die erste Anweisung nach der CTE die CTE verwenden kann.

+0

danke ich ging mit einer CTE-Lösung - siehe die Frage für das Update – scgough

0

Sie können auch Ansichten aktualisieren, nicht nur Tabellen.

Try this:

UPDATE T 
SET [rank] = [new_rank_num] 
FROM (
    SELECT 
     [rank]   = [rank], 
     [new_rank_num] = row_number() over (order by otherRank) 
    FROM mytable 
    WHERE parentID = 628 
) T 
Verwandte Themen