удалить обновления для запуска для тех же полей - PullRequest
1 голос
/ 11 октября 2011

Я работаю над устаревшим кодом, который выполняет обновления для определенной строки по одному полю за раз.История работает так, что все поля записываются каждый раз, когда происходит обновление, вставка или удаление.Как удалить все обновления, кроме последнего, в пределах определенного OrderId, небольшого интервала времени и того же идентификатора пользователя, если после того, как триггер завершил вставку в мою таблицу истории?автоинкрементный первичный ключ.Таким образом, у меня должно быть два или более HistoryId, но только один OrderId, и разница в датах должна быть не менее 5 секунд.Я хочу убедиться, что моя история не переполнена, поскольку у нас есть только ограниченное пространство для отслеживания истории.Также я хочу использовать данные только в том случае, если идентификатор пользователя такой же.

1 Ответ

1 голос
/ 29 марта 2012

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

delete h
from   tblHistory h
inner join inserted i
  on   i.OrderId = h.OrderId
  and  i.UserId = h.UserId
where  h.MyDate > dateadd("s",-5,getdate())
  and  h.HistoryID <
       (select max(h2.HistoryID)
       from    tblHistory h2
       where   h2.OrderId = i.OrderId);

Я считал, что можно вставлять более одной строки за раз, в результате чего добавляется больше одной записи.В конце следует удалить макс.одна запись на исполнение.Вам могут потребоваться индексы для (OrderId, HistoryId) и (OrderId, UserId, MyDate) для хорошей производительности.

HTH

...