2010-04-02 58 views
1

我不知道该怎么说这个原因我现在有点困惑,所以请耐心等待,但我试图解释一下,我有一个表格,内容如下:在SQL插入过程中增加非唯一字段

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

OrderLineID是主键,并始终是唯一的(这不是问题),订单ID是一个外键,是不是唯一的(不是问题),以及订单行是不是唯一的值该表,但应该是唯一的任何OrderIDs是相同的...所以如果没有任何意义,也许是图片...

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

对于所有OrderID,都有一个唯一的OrderLine。我试图创建一个插入语句来获取特定OrderId的最大OrderLine值,这样我就可以增加它,但它不能很好地工作,我可以使用一些帮助。我现在所拥有的是,我在程序中构建SQL语句并用实际值替换OrderID#。我敢肯定,问题是嵌套的select语句,并且增加的结果,但我找不到这样做,因为我的谷歌技能显然是薄弱任何例子....

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

任何帮助将对人好点。

+0

你为什么存储订单项目表中?最好尝试避免表模式中的这种依赖字段。搜索谷歌规范化的提示。 – 2010-04-02 05:40:41

+0

不错,但是我需要使用它,而且我无法控制它......所以我必须处理它。 – phill 2010-04-02 05:45:32

+0

菲尔,什么是“不太好?”你有错误吗?当我尝试时,您的代码适用于我。 – Jason 2010-04-02 05:54:38

回答

0

本语句也适用于Access 2003中你将不得不在WHERE子句中来代替你的OrderID值。

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

对不起,有点累,午夜在这里,这可能会增加这个问题,错过了包括错误在内的一些事情。首先,冒着让你们几个人发抖的风险,这是一个带有Access数据库的VB.net项目(不管是..)。我可以找到的说我可以做到这一点,但我试图执行它时,却得到了“查询输入必须包含至少一个表或查询”错误。如果我删除嵌套选择,并使用任意值,它将起作用。 – phill 2010-04-02 06:06:54

0

不要使用值,并选择的组合。尝试:

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 #>)
)