Case VS Многократные Обновления - PullRequest
0 голосов
/ 01 апреля 2011

У меня есть инструкция для обновления поля, если существует связанная запись таблицы.Запрос обновляется для каждой записи.Я не был уверен, каким будет самый эффективный / лучший способ сделать это.До сих пор я придумал 2 решения

Решение первое: Описание ситуации

UPDATE item
SET IsRestricted = 
    CASE 
        WHEN restriction.Id is null THEN 0
        ELSE 1
    END
FROM [dbo].[Item] item
    left join [dbo].[Restriction] restriction
        on restriction.Id = item.Id

Решение второе: Несколько операторов обновления

UPDATE item
SET IsRestricted = 1
FROM [dbo].[Restriction] restriction 
    inner join [dbo].[Item] item
        on restriction.Id = item.Id

UPDATE item
SET IsRestricted = 0
FROM [dbo].[Item] item
    left join [dbo].[Restriction] restriction
        on item.Id = restriction.Id
WHERE restriction.Id is null

Если бы кто-нибудь мог помочь мне определить, что я должен использовать, он был бы признателен.

Примечание: Не уверен, что это повторяющийся пост, покапохожие, которые я видел, включают в себя триггеры или разные другие вещи, и я не уверен, что это изменит ответ.Также не стесняйтесь предлагать альтернативные подходы

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

Как уже упоминали некоторые люди, вы можете провести несколько тестов производительности и проверить план выполнения, чтобы оба варианта работали лучше всего.

Если вы собираетесь выполнить этот оператор только один раз, я бы использовал первый метод, поскольку вы знаете, что вам нужно будет обновить все записи, а один оператор сделает все просто и красиво.Если это будет выполняться несколько раз (т.е. при добавлении новых данных), я бы использовал второе решение с добавлением к предложению where, проверяя, что оно не равно 0/1 при повторной установке.Это должно сводить обработку к минимуму.

0 голосов
/ 07 апреля 2011

Ну, после некоторого тестирования производительности кажется, что они оба одинаковы по производительности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...