2012-11-21 68 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