2009-02-13 3 views
4

У меня возникла ситуация, когда мне нужно добавить произвольный уникальный идентификатор для каждой группы записей. Проще визуализировать это ниже.Назначить уникальный идентификатор в группах записей

Отредактировано 11:26: В настоящее время в поле lineNum есть мусор. Это выполняется на сервере sql 2000. Ниже приведен пример, который должен выглядеть, но фактические значения не важны, цифры могут быть любыми, если два комбинированных поля могут использоваться для уникального ключа.

OrderID  lineNum 
AAA   1 
AAA   2 
AAA   3 
BBB   1 
CCC   1 
CCC   2 

Значение строки num не имеет значения, но поле имеет всего 4 символа. Это необходимо сделать в хранимой процедуре сервера sql. У меня нет проблем делать это программно.

+0

Стол, который вы разместили, является тем, что вы хотите или что у вас есть? Пожалуйста, напишите обоим: что у вас есть сейчас и что вы хотите получить. На данный момент это сбивает с толку. – Quassnoi

ответ

8

Если предположить, что с помощью SQL Server 2005 или более вы можете использовать row_number()

select orderId, 
     row_number() over(PARTITION BY orderId ORDER BY orderId) as lineNum 
from Order 
0

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

т.д .:

AAA reset 1 
AAA set 1 + 1 = 2 
AAA set 2 + 1 = 3 
BBB reset 1 
CCC reset 1 
CCC set 1 + 1 = 1 
0

Hmmmmm, вы могли бы создать представление, которое возвращает информацию номер строки, в порядке и группе его на основе вашего заказа ID? Убедитесь, что номер строки всегда возвращается в том же порядке.

Либо это, либо вы можете использовать триггер и на вставке вычислить максимальный id для заказа?

Или, может быть, вы могли бы использовать инструкцию select из max на вставке?

Возможно, ни одно из них не является удовлетворительным?

0

При добавлении записи в таблицу, можно создать поле "LINENUM" динамически:

В Transact-SQL, что-то вроде этого:

Declare @lineNum AS INT 

-- Get next linenum 
SELECT @lineNum = MAX(COALESCE(linenum, 0)) FROM Orders WHERE OrderID = @OrderID 
SET @lineNum = @lineNum + 1 

INSERT INTO ORDERS (OrderID, linenum, .....) 
VALUES (@OrderID, @lineNum, ....) 
0

Если вы не используете SQL 2005 это немного больше набора на основе способа сделать это (я не люблю временные таблицы много, но мне нравится курсоры л ess):

declare @out table (id tinyint identity(1,1), orderid char(4)) 

insert @out select orderid from THESOURCETABLE 

select 
    o.orderid, o.id - omin.minid + 1 as linenum 
from @out o 
    inner join 
     (select orderid, min(id) minid from @out group by orderid) as omin on 
      o.orderid = omin.orderid 
Смежные вопросы