2016-09-12 9 views
0
UPDATE invoice 
SET totalAmount = (SELECT SUM(price) AS 'total' 
        FROM cart c , cartitem ci , item i 
        WHERE c.cartId = ci.cartId AND ci.itemId = i.itemId 
        AND c.cartId = 1 
       ) 
WHERE cartId =1; 

UPDATE invoice 
SET totalAmount = (SELECT SUM(price) AS 'total' 
        FROM cart c , cartitem ci , item i 
        WHERE c.cartId = ci.cartId AND ci.itemId = i.itemId 
        AND c.cartId = 2 
       ) 
WHERE cartId =2; 

SQLコードを参照してください。レコードごとにレコードを更新するのではなく、一度にすべてのレコードを更新するソリューションがあります。これは割り当てのための方法ですが、私は内部結合またはトリガーを使用することはできません。 ありがとうございます。複数の結果に対するsql updateクエリ。 (内部結合とトリガーなし)

+0

互換性のないデータベースタグを削除しました。実際に使用しているデータベースに質問にタグを付けてください。 –

答えて

0
UPDATE invoice 
SET totalAmount = (SELECT SUM(price) AS 'total' 
        FROM cart c join cartitem ci 
        on c.cartId = ci.cartId join item i on ci.itemId = i.itemId 
        AND c.cartId in (1,2) 
       ) 
WHERE cartId in (1,2) 
+0

これは、インボイス1と2に同じ値を割り当てます。つまり、そのアイテムの合計は、質問のクエリとは異なります。 –

2

は、サブクエリが、更新に相関してください(c.cartId = invoice.cartId)と、あなたは、単一のステートメントに必要な数の請求書を更新することができるようになります。

UPDATE invoice 
SET totalAmount = (SELECT SUM(price) AS 'total' 
        FROM cart c , cartitem ci , item i 
        WHERE c.cartId = ci.cartId AND ci.itemId = i.itemId 
        AND c.cartId = invoice.cartId 
       ) 
WHERE cartId in (1, 2); 
+0

は、 'sum'を制限するために内部フィルタが必要ないでしょう – TheGameiswar

+1

いいえ、c.cartId = invoice.cartIdをフィルタに設定すると、請求書の項目だけが合計されます。 –

+0

相関がないため、サブクエリはすべての行に対して1回呼び出されます – TheGameiswar

2
UPDATE invoice i 
SET totalAmount = 
    (SELECT SUM(price) AS 'total' 
     FROM cart c , cartitem ci , item i 
     WHERE c.cartId = ci.cartId AND ci.itemId = i.itemId 
     AND c.cartId = i.cartId 
    ) 
WHERE cartId IN (1, 2); 

あなたはinvoiceテーブルのフィールドとしてcartIdを参照している場合

+0

あなたは 'sum'を制限するために内部フィルタを必要としません – TheGameiswar

1

それはあなたのために働く必要があるこのお試しください:

UPDATE i SET i.totalAmount = t.total 
FROM invoice i 
INNER JOIN (SELECT c.cartId, SUM(price) AS total 
       FROM cart c , cartitem ci , item i 
       WHERE c.cartId = ci.cartId AND ci.itemId = i.itemId 
       AND c.cartId IN (1,2) 
     GROUP BY c.cartId 
) t ON t.cartId = i.cartId 
+0

これは請求書1と2に同じ値を割り当てます。これは、それらの項目の合計です。これは質問の質問とは異なります。 –

1

あなたは、サブクエリのスカラー関数を作成していることを使用することができますfor totalAmountを更新します。 を

--Select dbo.fnGetTotalCartAmount(1) 
CREATE FUNCTION [dbo].[fnGetTotalCartAmount](@cartId int) 
RETURNS numeric(18,2) 
AS  
BEGIN 
    declare @TotalAmount numeric(18,2) 
       SELECT @TotalAmount = SUM(price) 
        FROM cart c , cartitem ci , item i 
        WHERE c.cartId = ci.cartId AND ci.itemId = i.itemId 
        AND c.cartId = @cartId 

RETURN @TotalAmount; 

END 

とし、次のように更新ステートメントで使用します。

UPDATE invoice SET totalAmount = dbo.fnGetTotalCartAmount(cartId) 
関連する問題