Увеличение неуникального поля во время вставки SQL - PullRequest
1 голос
/ 02 апреля 2010

Я не знаю, как это сформулировать, потому что сейчас я немного запутался, поэтому потерпите меня, пока я пытаюсь объяснить, у меня есть таблица со следующими полями:

OrderLineID, OrderID, OrderLine, and a few other unimportant ones.

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

OrderLineID, OrderID, OrderLine
     1          1         1
     2          1         2
     3          1         3
     4          2         1
     5          2         2

Для всех идентификаторов OrderID существует уникальный OrderLine. Я пытаюсь создать оператор вставки, который получает максимальное значение OrderLine для определенного OrderId, чтобы я мог увеличить его, но он работает не так хорошо, и я мог бы воспользоваться небольшой помощью. То, что у меня есть сейчас, ниже, я строю оператор SQL в программе и заменяю OrderID # на фактическое значение. Я почти уверен, что проблема заключается во вложенном операторе select и увеличении результата, но я не могу найти примеров, которые бы это делали, поскольку мои навыки в Google, по-видимому, слабы ....

INSERT INTO tblOrderLine (OrderID, OrderLine) VALUES 
       (<OrderID #>, (SELECT MAX(OrderLine) 
                       FROM tblOrderLine WHERE orderID = <same OrderID #>)+1)

Любая помощь будет хорошей.

Ответы [ 4 ]

0 голосов
/ 02 апреля 2010

Этот оператор работает в Access 2003. Вам необходимо заменить значение OrderID в предложении WHERE.

INSERT INTO tblOrderLine (OrderID, OrderLine)
SELECT
    s.OrderID, 
    s.MaxOrderLine + 1 AS NewOrderLine
FROM (
    SELECT
        OrderID, 
        Max(OrderLine) AS MaxOrderLine
    FROM
        tblOrderLine
    WHERE
        OrderID=1
    GROUP BY
        OrderID
    ) AS s;

Я читаю опасения других и оставлю мудрость этого подхода вам. Это может стать более интересным, если несколько пользователей одновременно обновят tblOrderLine.

0 голосов
/ 02 апреля 2010

Не используйте комбинацию VALUES и SELECT. Попробуйте:

INSERT INTO tblOrderLine (OrderID, OrderLine)
SELECT <OrderID #>, MAX(OrderLine)  
FROM tblOrderLine 
WHERE orderID = <same OrderID #>)+1
;
0 голосов
/ 02 апреля 2010

Добавление скаляра к результату запроса обычно не кошерно. Попробуйте переместить «+1»:

INSERT INTO tblOrderLine (OrderID, OrderLine) VALUES<br> (<br> <OrderID #>,<br> (SELECT MAX(OrderLine)<b>+1</b> FROM tblOrderLine WHERE orderID = <OrderID #>)<br> )

0 голосов
/ 02 апреля 2010

Вы получаете какую-то ошибку? Мне кажется, ваш SQL-код работает нормально.

...