2013-08-25 33 views
14

Próbuję dodać nową kolumnę do istniejącej tabeli, gdzie wartość jest numerem/rzędem wiersza. Potrzebuję sposobu, aby wygenerować wartość numeru wiersza/pozycji, a także muszę ograniczyć liczbę dotkniętych wierszy - w tym przypadku obecność podciągu w ciągu znaków.Jak dodać kolumnę numeru wiersza w SQL Server 2012

Teraz mam:

UPDATE table 
SET row_id=ROW_NUMBER() OVER (ORDER BY col1 desc) FROM table 
WHERE CHARINDEX('2009',col2) > 0 

i dostaję ten błąd:

Windowed functions can only appear in the SELECT or ORDER BY clauses. 

(sam błąd za RANK())

Czy istnieje jakiś sposób, aby utworzyć/zaktualizować kolumny funkcja ROW_NUMBER()? FYI, to ma zastąpić niepoprawną, już istniejącą kolumnę "rangi".

+0

Czy możesz podać, jakie kolumny znajdują się w Twoim stole, a przynajmniej te, które chcesz sortować, wyszukiwać i aktualizować? – dcaswell

Odpowiedz

24

Można to zrobić z CTE, coś takiego:

with cte as 
(
    select * 
    , new_row_id=ROW_NUMBER() OVER (ORDER BY col1 desc) 
    from MyTable 
    where charindex('2009',col2) > 0 
) 
update cte 
set row_id = new_row_id 

SQL Fiddle with demo.

+0

Dziękujemy, zadziałało, gdy utworzyłem pierwszy wiersz. –

-1

Proste obejście byłoby utworzyć tabelę temp, który wygląda jak

CREATE TABLE (id int #temp Rank int)

gdzie id jest tego samego typu, jak klucz podstawowy w was głównej tabeli.

Wystarczy użyć SELECT INTO najpierw wypełnić temp tabeli, a następnie zaktualizować z tabeli temp ...

1

Jeśli aktualizujesz tylko kilka tysięcy wierszy, możesz spróbować czegoś takiego:

select 'UPDATE MyTable SET ID = ' + CAST(RowID as varchar) + ' WHERE ID = ' + CAST(ID as varchar) 
From (
select MyTable, ROW_NUMBER() OVER (ORDER BY SortColumn) RowID from RaceEntry 
where SomeClause and SomeOtherClause 
) tbl 

kopiować i wklej wyniki zapytania do edytora zapytań i uruchom. Jest trochę powolny i nieco yukky, jak to działa.