2017-01-14 1 views
0

У меня очень быстрый вопрос. У меня есть ряд заказов, в которых каждый заказ может иметь приоритет. Приоритет может быть либо NULL, либо INT. Каждый сейчас и потом я хочу устроить приоритет назад, начиная с 1.Синтаксис SQL UPDATE для автоматического повторного набора номера

Например:

NULL, NULL, 5, NULL, 7, NULL, NULL, 15 

Изменить его

NULL, NULL, 1, NULL, 2, NULL, NULL, 3 

Что является наиболее эффективным SQL UPDATE синтаксис для достижения этой цели ? Есть идеи? Я не мог найти хороший способ архивировать это, но использовать курсор.

Приветствия, Sam

Edit - в соответствии с просьбой Йоргос Betsos

схемы (упрощенный для вопроса цели)

CREATE TABLE [dbo].[tblOrder] 
(
    [OrderId] [int] NOT NULL, 
    [Priority] [int] NULL, 

    CONSTRAINT [PK_tblOrder] 
     PRIMARY KEY ([OrderId] ASC) 
) 

Пример вывода

Order Id | Priority 
---------+--------- 
12343 | NULL 
12344 | NULL 
     ... 
     ... 
     ... 
12449 | 5 
12450 | NULL 
12451 | 7 
     ... 
     ... 
     ... 
12900 | NULL 
12901 | NULL 
12902 | 15 

Спасибо!

+1

пожалуйста, вы можете также разместить схему таблицы и настроить выборочные данные таким образом, чтобы включать имена полей? –

+0

Не следует избегать использования курсоров только потому, что все говорили вам, что они «злые». Если вы знаете синтаксис и можете написать запрос, который вам нужен, используйте его и используйте. Я понимаю, что вы спрашиваете: «Что является самым эффективным SQL UPDATE ..», но вы никогда не знаете, курсор может работать отлично. :) – Tony

+0

@Tony Cursors не только неэффективны и громоздки в использовании, они необходимы и ортогональны к декларативному основанному на множестве мышлению, который является родным для реляционных баз данных. Как только вы действительно поймете, что означает набор, вы никогда не оглядитесь на курсоры, если вы не будете вынуждены их использовать. – Lucero

ответ

3

После уточнений, запрос вы можете использовать что-то вроде:

;WITH ToUpdate AS (
    SELECT Priority, 
      ROW_NUMBER() OVER (ORDER BY Orderid) AS rn 
    FROM tblOrder 
    WHERE Priority IS NOT NULL 
) 
UPDATE ToUpdate 
SET Priority = rn 
+2

'mycol <> NULL' должен быть' mycol IS NOT NULL' –

+0

@Prdp Да, конечно же, спасибо! –

+0

@Giorgos Betsos, WOW, это действительно круто! Мне просто интересно, могу ли я (ORDER BY Priority) вместо (ORDER BY Orderid)? Потому что приоритет не связан с OrderId. Пользователь может установить номер приоритета в любом порядке. – Sam