2012-11-21 70 views
1

我有两个表MySQL的子查询语句select语句扣除股票

table_inventory:

item_no 
item_name 
item_qty 

table_pos:

orderno 
qty 

我要扣除购买物品(数量)到库存物料(item_qty)。这样我就可以直接更新table_inventory

UPDATE table_inventory 
SET item_qty = (item_qty - (SELECT qty FROM tblpos WHERE qty='" & txtqty.Text & "')) 
WHERE item_no='" & txtitemno.Text & "' 

我似乎已经猜对了,但每当我试了两次相同的项目。我会得到“子查询返回超过1行”

+1

没有这些例子在这里失踪ITEM_NO联接。看起来像缺少一些逻辑 – Drew

+0

不要你有table_pos表中的item_no? – DevT

回答

0

怎么样?:

UPDATE table_inventory 
SET 
    item_qty = (item_qty - (SELECT qty FROM tblpos WHERE qty='" & txtqty.Text & "' LIMIT 0,1)) 
WHERE item_no='" & txtitemno.Text & "' 

你真的应该作出sqlfiddle这样的人可以帮你更好的。

+0

对不起,我第一次问这里..我只是想知道,如果我有我的SQL语句中的一些错误?谢谢 – user1841167

+1

我已经通过在子查询中添加限制发布了一条建议。 我不能不幸地为你测试它,因为我不打算花时间来调整你的数据库。 但是,如果您要创建一个sqlfiddle,我可能会更倾向于详细提供帮助,其他人也会这样做。 – Tschallacka

+0

[链接] http://sqlfiddle.com/#!2/558ad – user1841167

0

首先,该查询看起来可疑 - 从其中数量值是由用户指定的表中选择数量。

为什么不直接使用用户的输入,在txtqty.Text直接?

其次,作为错误指示,即SELECT与相同数量的值返回多个行。如果这就是您的查询将要发生的事情,您可以简单地添加DISTINCT子句以获得只有一列的一列。

UPDATE table_inventory 
SET 
    item_qty = 
     (item_qty - (
        SELECT DISTINCT qty 
        FROM tblpos 
        WHERE qty='" & txtqty.Text & "' 
        ) 
     ) 
WHERE item_no='" & txtitemno.Text & "' 

或者干脆就使用用户输入本身。

另外,你的查询构造很容易受到SQL注入,你只是读取用户输入并追加到您的查询,而无需消毒他们。你也应该照顾。

+0

谢谢你帮我@Vikdor – user1841167

+0

如果我从另一个表..没有用户输入其扣除了.. – user1841167

+0

如果从另一个表推导,你应该确保在WHERE子句过滤器匹配只有一条记录,否则,就意味着有一些问题与逻辑本身。 – Vikdor

0

我觉得你需要数量的sum你之前扣除,所以我的建议是如下,

UPDATE table_inventory 
SET item_qty = 
(item_qty - (SELECT sum(qty) FROM tblpos WHERE qty='" & txtqty.Text & "' group by qty)) 
WHERE item_no='" & txtitemno.Text & "' 
+0

我试过了,但每当我输入一个数字,它就会从股票时间中扣除我输入的三个数值 – user1841167