t-sql: 'in' өрнегімен анықталған нақты ретпен жаңарту

Мысалы:

declare @counter int
set @counter = 0

update MyTable
set @counter = MyField = @counter + 1
where Some_ID in (select ID from SomeTable)

Мен қалаған нәрсе, бұл жаңарту SelectType ID идентификаторын таңдау идентификаторларымен бір тәртіпте орын алды. Мұны істеудің жақсы жолы бар ма?

0
Сіз мұны CTE және ROW_NUMBER көмегімен бір мәлімдемені пайдалана аласыз.
қосылды автор OMG Ponies, көзі
Сұраңыз ... неге? Тапсырыс белгіленген операцияларда маңызды болмауы керек.
қосылды автор Austin Salonen, көзі
@AustinSalonen бұл тек таңдау ID идентификаторы мені өзгерте алмайтын параметр ретінде белгілі бір тәртіпте келеді және бұл тапсырыс туралы ақпаратты сақтау үшін MyField керек
қосылды автор ren, көзі

2 жауаптар

ROW_NUMBER көмегімен CTE-ді пайдалану арқылы шешім ... OVER OVER ішіндегі жазбаларды SomeTable код> ROW_NUMBER .

;WITH rn (ID, rowNumber) AS
(
    SELECT st.ID, ROW_NUMBER() OVER (ORDER BY st.ID)
    FROM SomeTable st
    WHERE EXISTS (
        SELECT 1
        FROM MyTable mt
        WHERE mt.Some_ID = st.ID
    )   
)
UPDATE mt
SET MyField = rowNumber
FROM 
    MyTable mt 
    JOIN rn ON rn.ID = mt.Some_ID
5
қосылды

Жаңартылған жазбалардағы қосымша нөмірді қамтитын бағанды ​​алуды қаласаңыз, менің ойымша, мұны жалғыз жолмен идентификаторлар тізімін алу және бірқатар жаңартуларды жасау болып табылады.

SQL серверінде сіз мұны курсор арқылы жасай аласыз.

DECLARE @id int, @counter int
SET @counter = 0
DECLARE ids CURSOR
  FOR SELECT ID FROM SomeTable

OPEN ids
FETCH NEXT FROM ids INTO @id

WHILE @@FETCH_STATUS == 0
BEGIN
  UPDATE MyTable SET MyField = @counter WHERE Some_ID = @id
  SET @counter = @counter + 1
  FETCH NEXT FROM ids INTO @id
END

CLOSE ids
DEALLOCATE ids
2
қосылды
бірақ, декларативті жол деп үміттенемін
қосылды автор ren, көзі