2010-04-02 5 views
1

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

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. Я пытаюсь создать инструкцию insert, которая получает максимальное значение OrderLine для определенного OrderId, поэтому я могу увеличить его, но он работает не так хорошо, и я мог бы немного помочь. То, что я имею сейчас, ниже, я строю инструкцию SQL в программе и заменяю OrderID # фактическим значением. Я уверен, что проблема с вложенным оператором выбора, и увеличивающимся результатом, но я не могу найти какие-либо примеры, которые делают это, так как мои навыки Google слабыми, по-видимому ....

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

Любой помощь будет будь красивой.

+0

Почему вы храните в таблице порядковый номер? Лучше всего попытаться избежать такого зависимого поля в вашей схеме таблиц. Найдите в Google для нормализации советы по этому поводу. –

+0

Правда, однако требуется, чтобы я использовал его, и я не контролирую его ... поэтому мне приходится с этим справляться. – phill

+0

Фил, что «не работает так хорошо?» Вы получаете сообщение об ошибке? Ваш код работает для меня, когда я пытаюсь. – Jason

ответ

0

Это утверждение работает в Access 2003. Вы должны заменить свою ценность ИД_заказа в ИНЕКЕ.

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

Вы получаете ошибку определенного типа? Ваш SQL-код, похоже, отлично работает для меня.

+0

Извините, немного устал, здесь полночь, и это может добавить к проблеме, пропустил пару вещей, включая ошибку. Прежде всего, рискуя заставить вас немного дрожать, это проект VB.net с базой данных Access (без контроля над ..). То, что я могу найти, говорит, что я могу это сделать, но вместо этого получаю сообщение «Запрос ввода должен содержать хотя бы одну таблицу или запрос» при попытке выполнить его. Если я удалю вложенный выбор и использую произвольное значение, он будет работать. – phill

0

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^