Обновить каждый выбранный результат строки без курсора - PullRequest
2 голосов
/ 22 апреля 2020

На своем пути учусь делать разные вещи с t sql. Я хочу улучшить свой код и хотел бы получить совет.

Допустим, у меня есть этот выбор:

SELECT [Id], [Type]
FROM 
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY [Id] ORDER BY CurrentDate DESC) AS RowN,
        CS.*
    FROM [CookieStore] CS 
)RN
WHERE RN.RowN = 1

, который возвращает мне таблицу результатов с несколькими строками:

1) id=5  Type='chocolate'
2) id=6  Type='oatmeal'
3) id=7  Type='gingerbread'

Чтобы достичь своей цели, я делаю курсор над результатом выбора, чтобы выполнить обновление:

/* some cursor logic */

UPDATE [SweetShop] SET [Type] = @CookieShopType WHERE [Id]=@CookieStoreId

/* some cursor logic */

Есть ли способ сделать обновление для каждой строки из выбора без курсора? Или в этом случае других вариантов нет?

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Используйте CTE, а также вы можете избежать написания подзапроса внутри CTE.

WITH CTE AS (
    SELECT
        ROW_NUMBER() OVER(PARTITION BY [Id] ORDER BY CurrentDate DESC) AS RowN,
        CS.*
    FROM [CookieStore] CS 
)

UPDATE 
    [SweetShop]
SET 
    [Type] = cte.[Type]
FROM
    [SweetShop] as SS 
INNER JOIN
    CTE as C
ON cte.Id = d.Id
WHERE CTE.RowN = 1
0 голосов
/ 01 мая 2020

Вы можете выполнить эту операцию с подходом, основанным на множестве (без курсоров).

Сначала вы определяете CTE, используя свой исходный запрос, затем вы можете использовать оператор UPDATE FROM, чтобы обновить целевую таблицу из объединение между CTE и таблицей назначения:

;with temp as (
    SELECT [Id], [Type]
    FROM 
    (
        SELECT
            ROW_NUMBER() OVER(PARTITION BY [Id] ORDER BY CurrentDate DESC) AS RowN,
            CS.*
        FROM [CookieStore] CS 
    )RN
    WHERE RN.RowN = 1
)
update 
    [SweetShop]
set 
    [Type] = t.[Type]
from
    [SweetShop] as d 
        inner join
    temp as t
        on t.Id = d.Id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...