Назначить уникальный идентификатор в группах записей - PullRequest
4 голосов
/ 13 февраля 2009

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

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

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

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

Ответы [ 5 ]

8 голосов
/ 13 февраля 2009

Если вы используете SQL Server 2005 или выше, вы можете использовать Row_Number ()

select orderId,
       row_number() over(PARTITION BY orderId ORDER BY orderId) as lineNum
from Order
1 голос
/ 13 февраля 2009

При добавлении записи в таблицу вы можете динамически создать поле «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 голосов
/ 13 февраля 2009

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

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
0 голосов
/ 13 февраля 2009

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

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

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

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

0 голосов
/ 13 февраля 2009

Вы можете создать курсор, который будет читать все отсортированные значения, затем при каждом изменении значения сбрасывать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...