0

まず、質問の簡潔な要約は次のとおりです。

INSERT ステートメントを条件付きで実行することは可能ですか? これに似たもの:

IF(expression) INSERT...

これで、ストアド プロシージャを使用してこれを実行できることがわかりました。

今、私はそれをしたいです

次の 3 つのテーブルがあるとします。

products: id, qty_on_hand
orders: id, product_id, qty
roomTable :id,product_id,room_number,booked_status

ここで、20 部屋 (製品 ID 2) の注文が入ったとします。最初に、注文テーブルから指定された product_id の合計数量を total_qty および total_qty < qty_on_hand としてチェックし、それが true を返す場合は、注文値を挿入し、最後にbooked_status= の後に 1 部屋を更新します。 booked_status ='Y' の roomTable から 'Y' 部屋を取得し、その部屋の ID を指定します。

問題は、結合クエリを作成できないことです。私がこれまでにやったこと -

    INSERT INTO orders(product_id, qty)
SELECT 2, 20 FROM products WHERE id = 2 AND qty_on_hand >= 20
4

2 に答える 2

1

シュナイダー山からこのテクニックがどのように機能するかについての詳細が必要な方は、

INSERT INTO orders(product_id, qty)
SELECT 2, 20 
  FROM products 
 WHERE id = 2 AND qty_on_hand >= 20 + (select sum(qty) from orders where product_id = 2)

ここで起こっていることは、select ステートメントの結果がハードコーディングされているということです。この場合、INSERT INTO orders(product_id, qty) VALUES(2, 20) を取得し、VALUES(2,20) を SELECT 2, 20 に置き換えます。SELECT の結果はハードコードされていますが、条件が満たされた場合にのみ値を返します。満たされます。

この手法について詳しく説明している次の記事を見つけました。

http://boulderapps.co/dont-insert-when-maximum-is-reached

于 2014-05-09T20:16:38.823 に答える
0

こんな感じではないでしょうか?

INSERT INTO orders(product_id, qty)
SELECT 2, 20 
  FROM products 
 WHERE id = 2 AND qty_on_hand >= 20 + (select sum(qty) from orders where product_id = 2)

そのため、最後の注文数量に挿入される注文の数量を加えたものが手元にあるものよりも少ないか等しい場合、挿入されません。

于 2013-01-25T19:05:18.263 に答える