Как сделать столбец в серийном номере, даже если один номер удален - PullRequest
1 голос
/ 25 апреля 2020

У меня есть таблица

FieldName | FieldValue | FieldOrder 
-------------------------------------
Srl       | value1     |  0
Data      | value2     |  0
Content   | value3     |  0
Srl       | val1       |  1
Data      | val2       |  1
Content   | val3       |  1
Srl       | vall1      |  2
Data      | vall2      |  2
Content   | vall3      |  2
Srl       | data1      |  3
Data      | data2      |  3
Content   | data3      |  3

Если я удаляю несколько строк, которые

Delete from CatogoryFieldValueMaster where FieldOrder = 1
//It will show result as
FieldName | FieldValue | FieldOrder 
-------------------------------------
Srl       | value1     |  0
Data      | value2     |  0
Content   | value3     |  0
Srl       | vall1      |  2
Data      | vall2      |  2
Content   | vall3      |  2
Srl       | data1      |  3
Data      | data2      |  3
Content   | data3      |  3

Мне нужно обновить таблицу, чтобы изменить порядок столбцов FieldOrder, чтобы они отображались как 0,1 , 2,3 .... Какие изменения мне нужно сделать, чтобы получить мой стол как

FieldName | FieldValue | FieldOrder 
-------------------------------------
Srl       | value1     |  0
Data      | value2     |  0
Content   | value3     |  0
Srl       | vall1      |  1
Data      | vall2      |  1
Content   | vall3      |  1
Srl       | data1      |  2
Data      | data2      |  2
Content   | data3      |  2

Пожалуйста, помогите мне

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Мне нужно обновить таблицу, чтобы изменить порядок столбцов FieldOrder, чтобы они отображались как 0,1,2,3 ....

Если вы хотите изменить значения, используйте обновляемый CTE, как предлагает GMB. Тем не менее, я бы подошел к этому, используя dense_rank() вместо row_number():

with toupdate as (
      select cfvm.*,
             dense_rank() over (order by FieldOrder) - 1 as new_FieldOrder
      from CatogoryFieldValueMaster cfvm
     ) 
update toupdate
    set FieldOrder = new_FieldOrder
    where FieldOrder <> new_FieldOrder;

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

2 голосов
/ 25 апреля 2020

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

Вместо этого вы можете вычислить его на лету с помощью row_number() в представлении:

create view CatogoryFieldValueMasterView as
select 
    FieldName,
    FieldValue,
    row_number() over(partition by FieldName order by FieldValue) - 1 FieldOrder
from CatogoryFieldValueMaster

Тем не менее, если вы действительно хотите оператор update, вот вариант с использованием обновляемого cte:

with cte as (
    select 
        FieldOrder,
        row_number() over(partition by FieldName order by FieldValue) - 1 FieldOrderNew
    from CatogoryFieldValueMaster
) 
update cte set FieldOrder = FieldOrderNew
...