Подтвердить что ты не робот

SQL Server: ОБНОВЛЯЙТЕ таблицу с помощью ORDER BY

Я хотел бы знать, есть ли способ использования предложения order by при обновлении таблицы. Я обновляю таблицу и устанавливаю последовательный номер, поэтому порядок обновления важен. Используя следующий оператор sql, я смог решить его без использования курсора:

DECLARE @Number INT = 0

UPDATE Test
SET @Number = Number = @Number +1

теперь то, что я хотел бы сделать, - это порядок от clause следующим образом:

 DECLARE @Number INT = 0

 UPDATE Test
 SET @Number = Number = @Number +1
 ORDER BY Test.Id DESC

Я читал: Как обновить и заказать с помощью ms sql Решения по этому вопросу не решают проблему заказа - они просто фильтруют элементы, на которых обновление применяется.

Позаботьтесь, Мартин

4b9b3361

Ответ 1

Нет.

Не документированный 100% поддерживаемый способ. Существует подход, который иногда используется для вычисления текущих итогов, называемых " quirky update", который предполагает, что он может обновляться в порядке кластеризованного индекса, если выполняются определенные условия но, насколько я знаю, это полностью зависит от эмпирического наблюдения, а не от каких-либо гарантий.

Но какая версия SQL Server у вас? Если SQL2005 + вы можете что-то сделать с помощью row_number и CTE (вы можете обновить CTE)

With cte As
(
SELECT id,Number,
ROW_NUMBER() OVER (ORDER BY id DESC) AS RN
FROM Test
)
UPDATE cte SET Number=RN

Ответ 2

Вы не можете использовать ORDER BY как часть UPDATE (вы можете использовать в подвыборках, которые являются частью обновления).

UPDATE Test 
SET Number = rowNumber 
FROM Test
INNER JOIN 
(SELECT ID, row_number() OVER (ORDER BY ID DESC) as rowNumber
FROM Test) drRowNumbers ON drRowNumbers.ID = Test.ID

Ответ 3

Изменить

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

Ответ ведется для обучения тех (как я), которые не знают всех побочных эффектов или ошибок SQL Server.


Развернувшись на ответе "Кваснуй" в вашей ссылке, выполните работы

DECLARE @Test TABLE (Number INTEGER, AText VARCHAR(2), ID INTEGER)
DECLARE @Number INT

INSERT INTO @Test VALUES (1, 'A', 1)
INSERT INTO @Test VALUES (2, 'B', 2)
INSERT INTO @Test VALUES (1, 'E', 5)
INSERT INTO @Test VALUES (3, 'C', 3)
INSERT INTO @Test VALUES (2, 'D', 4)

SET @Number = 0

;WITH q AS (
    SELECT  TOP 1000000 *
    FROM    @Test
    ORDER BY
            ID
)            
UPDATE  q
SET     @Number = Number = @Number + 1

Ответ 4

Функция row_number() будет лучшим подходом к этой проблеме.

UPDATE T
    SET T.Number = R.rowNum
    FROM Test T
    JOIN (
        SELECT T2.id,row_number() over (order by T2.Id desc) rowNum from Test T2
    ) R on T.id=R.id 

Ответ 5

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

Я создал Просмотр (сохранение) 2 порядка сортировки (* пояснение о том, как это сделать ниже).

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

Вот два вопроса, которые я использовал в представлении:

1-й запрос:

Update  MyView
Set SortID=0


Второй запрос:

DECLARE @sortID int
SET     @sortID = 0
UPDATE  MyView
SET     @sortID = sortID = @sortID + 1


* Чтобы иметь возможность сохранять сортировку в представлении, я помещаю TOP в инструкцию SELECT. Это очень полезное обходное решение позволяет возвращать результаты View, отсортированные как заданные, когда View был создан при открытии View. В моем случае это выглядело так:

(ПРИМЕЧАНИЕ. Использование этого обходного пути сделает большую нагрузку на сервере, если вы используете большую таблицу, и поэтому рекомендуется включать как можно меньше полей в представление при работе с большими таблицами)

SELECT     TOP (600000) 
dbo.Items.ID, dbo.Items.Code, dbo.Items.SortID, dbo.Supplier.Date, 
dbo.Supplier.Code AS Expr1
FROM         dbo.Items INNER JOIN
                      dbo.Supplier ON dbo.Items.SupplierCode = dbo.Supplier.Code
ORDER BY dbo.Supplier.Date, dbo.Items.ID DESC



Запуск: SQL Server 2005 на Windows Server 2003

Дополнительные ключевые слова: как обновить столбец SQL с восходящими или нисходящими числами - числовые значения/как установить порядок в инструкции SQL update/как сохранить порядок в sql view/increment sql update/auto autoincrement sql update/create sql field with upcending числа

Ответ 6

обновление на основе порядка упорядочения по порядку значений в предложении SQL IN()

Решение:

DECLARE @counter int
SET @counter = 0

;WITH q  AS
        (
select * from Products WHERE ID in (SELECT TOP (10) ID FROM Products WHERE  ID IN( 3,2,1) 
ORDER BY ID DESC)
        )
update q set Display= @counter, @counter = @counter + 1

Это обновление основано на нисходящем 3,2,1

Надежда помогает кому-то.

Ответ 7

У меня была аналогичная проблема и она была решена с использованием ROW_NUMBER() в сочетании с ключевым словом OVER. Задача состояла в том, чтобы ретроспективно заполнить новое поле TicketNo (целое число) в простой таблице на основе оригинала CreatedDate и сгруппировано по ModuleId - так, чтобы номера билетов начинались с 1 в каждой группе модулей и увеличивались по дате. В таблице уже был первичный ключ TicketID (GUID).

Здесь SQL:

UPDATE Tickets SET TicketNo=T2.RowNo
FROM Tickets
INNER JOIN 
  (select TicketID, TicketNo, 
     ROW_NUMBER() OVER (PARTITION BY ModuleId ORDER BY DateCreated) AS RowNo from Tickets) 
  AS T2 ON T2.TicketID = Tickets.TicketID

Работало с удовольствием!

Ответ 8

Я тестировал приведенный ниже код в MYSQL для обновления последней записи. Вот почему я использую порядок в первую очередь. Он обновит столбец статуса последней записи

 UPDATE DBTest.logTable
 SET status='Test' 
 ORDER BY ID DESC limit 1 ;