2016-03-03 106 views
0

我正在使用ms-sql服務器。我有table,我想updateselect statement。例如,我想更新的表格是Table_A,其中有2 rows。我想更新Table_A的更新語句返回10 rows。所以我想要update Table_A 10 times。問題是Table_A是updated 2 timesthe count of rows in Table_A)。從選擇更新表

例子:

CREATE TABLE #tmp 
(
    AccountID INT, 
    Inflow DECIMAL(10,2) 
) 


DECLARE @n INT = 0 
WHILE (@n <10) 
BEGIN 
    INSERT INTO #tmp SELECT 2, 10 
    SET @n += 1 
END 

UPDATE dbo.Table_A 
SET  Balance += sss.Inflow 
FROM (SELECT t.AccountID , 
        t.Inflow 
      FROM  #tmp AS t 
     ) AS sss 
WHERE dbo.tAccount.AccountID = sss.AccountID; 

-- Updates only 2 times 
-- What I expected here is Table_A to be updated as many times as the count of the select statement which is 10, based on the insert before. 
+0

首先,我猜你正在使用基於語法的SQL Server。其次,你的期望是錯誤的。一行只更新一次。 –

+0

是的,它只更新一次。我的期望是根據select語句的計數更新10次,語法如下。 – TheChampp

+0

您只能更新表A中的內容。如果只有2條記錄,則只能更新這2條記錄。你需要插入其他8。 –

回答

2

你的期望是錯誤的。誠然,documentation埋這種想法:

的示例運行沒有錯誤,但每個SalesYTD值更新 只有一個銷售,不管有多少銷售實際發生在那一天 。 這是因爲單個UPDATE語句從不更新 同一行兩次。

文檔繼續與解決方案:

的情況,其中多個銷售爲指定 銷售人員可以在同一天發生,所有的銷售每個銷售 人必須可以在UPDATE語句中聚集在一起,如下面的示例所示 :做之前

所以,簡單地彙總join

UPDATE dbo.Table_A 
SET Balance += sss.Inflow 
FROM (SELECT t.AccountID, SUM(t.Inflow) as Inflow 
     FROM #tmp t 
     GROUP BY t.AccountId 
    ) sss 
WHERE dbo.tAccount.AccountID = sss.AccountID; 

注意你也可以寫爲:

UPDATE a 
SET Balance += sss.Inflow 
FROM dbo.Table_A a JOIN 
    (SELECT t.AccountID, SUM(t.Inflow) as Inflow 
     FROM #tmp t 
     GROUP BY t.AccountId 
    ) sss 
    ON a.AccountID = sss.AccountID; 

這使得JOIN更加明確。