2011-12-20 54 views
0

我有這個查詢,首先檢查項目是否仍然可用。如果它仍然可用,那麼服務器將返回該項目,然後自動遞減它..這是我的語法,我想出來的是我只需要請求一次,因此我需要將這3個查詢合併成一個。可能嗎?我可以要求樣品嗎?3查詢在1交易mysql中

IF SELECT EXISTS (SELECT * FROM inventorylist WHERE BarcodeNumber = '9555440808279' AND NotificationQuantity > 0) 
BEGIN 
    UPDATE inventorylist SET NotificationQuantity = NotificationQuantity - 1 WHERE BarcodeNumber = '9555440808279'; 
    SELECT * FROM inventorylist WHERE BarcodeNumber = '9555440808279'; 
END 

此語法會返回一個錯誤..

所有的
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF SELECT EXISTS (SELECT * FROM inventorylist WHERE BarcodeNumber = '95554408082' at line 1 
[Err] IF SELECT EXISTS (SELECT * FROM inventorylist WHERE BarcodeNumber = '9555440808279' AND NotificationQuantity > 0) 
BEGIN 
UPDATE inventorylist SET NotificationQuantity = NotificationQuantity - 1 WHERE BarcodeNumber = '9555440808279'; 

+1

SQL不是一種編程語言:-) – Rufinus 2011-12-20 13:19:39

+0

你指的是我在聲明中使用的「if」嗎?我認爲tsql具有該功能.. :) – 2011-12-20 13:22:33

+0

這不是原始SQL。你想寫一個存儲的例程嗎? – 2011-12-20 13:24:01

回答

0

首先,如果你只關心它的存在,那就不要用「SELECT *」打擾。只返回一個字段:

IF SELECT EXISTS (SELECT BarcodeNumber FROM inventorylist WHERE BarcodeNumber = '9555440808279' AND NotificationQuantity > 0) 

真的是沒有辦法(據我所知)返回剛剛更新與UPDATE syntax行。所以我認爲你最好的選擇是把你已經存入的東西放入存儲過程中。

2

什麼

START TRANSACTION; 
SELECT @s:=(SELECT ifnull(count(*),0) FROM inventorylist WHERE BarcodeNumber='9555440808279' and NotificationQuantity>0); 
UPDATE inventorylist SET [email protected] WHERE BarcodeNumber='9555440808279' and NotificationQuantity>0); 
SELECT inventorylist.*,@s AS success FROM inventorylist; 
COMMIT; 

這將八方通還給你的文章,並添加一個成功的領域。

+0

這很漂亮,但它仍然運行3個不同的查詢/命令。 – Aaron 2011-12-20 14:12:03

+0

@ BryceAtNetwork23它使用事務。儘管使用3個不同的查詢,事務處理速度更快 – 2011-12-20 14:41:55

+0

我想每個解決方案都必須這樣做 - 涉及三個步驟。 – 2011-12-20 14:43:31