2015-02-27 2 views
0

Есть ли способ определить столбец идентификации в другом столбце? То, что я хочу выполнить, - это таблица, в которой хранятся позиции заказа, и эти заказы могут быть добавлены в любое время. Так что может быть, что уже позволяет говорить три позиции в таблице, и это будет выглядеть примерно так:Столбец SQL IDENTITY на основе другого столбца

OrderNumber | OrderPosition 
10001   1 
10001   2 
10001   3 

А теперь я хочу добавить еще одну позицию, не вычисляя правильное значение для столбца OrderPosition. Это связано с тем, что я хочу писать новые позиции для нескольких заказов в таблицу и хотел бы избегать курсоров по отдельным заказам. Я бы предпочел решение, когда OrderPosition - это столбец идентичности, который будет обновлен на основе столбца OrderNumber. Итак, если я добавлю позицию заказа для нового заказа, она начнется с 1, и если я добавлю другую позицию для порядка 10001, она будет продолжена с 4.

+0

Привет могли бы вы опубликовать свое решение? Или как редактирование, либо отдельный ответ? – narain

ответ

1

Напишите Скалярную функцию, которая возвращает MAX (OrderPosition) на основе OrderNumber , Затем укажите эту функцию в инструкции вставки заказов

+0

Не приведет ли к ошибке, если я вставлю две новые позиции для того же порядка, так как вставка первой строки не была бы зафиксирована, и функция вернет тот же результат для обеих строк? –

+0

Короткий ответ - да, это возможно. Что такое likley hood: Это будет зависеть от того, были ли две вставки в рамках одной транзакции или нет. Также количество обрабатываемых заказов в отношении доступа к одному и тому же заказу одновременно. – Dbloch

+0

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

0

Ваше требование не будет работать для столбца идентификации.

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

declare @t table(OrderNumber int, OrderPosition int) 

insert into @t values (10001, 1),(10001, 2),(10001, 3),(10001, 4) 

select * from @t 

--now insert new record with old orderno 
declare @seq int = 1 
declare @ordernumberNew int = 10001 

--Eigher you can use :- insert to more understand 
if(exists(select orderposition from @t where OrderNumber = @ordernumberNew)) 
begin 
    set @seq = (select max(OrderPosition) + 1 from @t where OrderNumber = @ordernumberNew) 
end 

insert into @t values (@ordernumberNew , @seq) 

select * from @t 

--or another twist of above statement, insert directly as 
    insert into @t 
    values 
    (
     @ordernumberNew, 
     case when exists (select orderposition from @t where OrderNumber = @ordernumberNew) 
     then (select max(OrderPosition) + 1 from @t where OrderNumber = @ordernumberNew) 
     else 1 end 
    ) 

select * from @t  

--Now enter the not exist order no 
set @ordernumberNew = 10006 

    insert into @t 
    values 
    (
     @ordernumberNew, 
     case when exists (select orderposition from @t where OrderNumber = @ordernumberNew) 
     then (select max(OrderPosition) + 1 from @t where OrderNumber = @ordernumberNew) 
     else 1 end 
    ) 

select * from @t  
+0

Но это все итеративные логики, не так ли? Мне пришлось бы перебирать все номера заказов. Мне нужно это избежать. Или я что-то пропустил? –

+0

«итеративный по всем номерам заказов» означает .. В вашем вопросе вы написали «Так что, если я добавлю позицию заказа», мой ответ основан на этом .. что вам нужно больше ... вы хотите вставить или обновить record..explain с примером ... – Ajay2707

+0

Я также написал: «Это потому, что я хочу писать новые позиции для нескольких заказов в таблицу и хотел бы избегать курсоров по отдельным заказам». Я думаю, что первый ответ, который был дан, уже решает мою проблему. В любом случае, спасибо. –