2015-01-05 24 views
1

下面是一個例子表:使用SQL Server,我怎麼可以更新所有行,但每一個不同的基於子查詢

BookID PK int 
Book varchar(50) 
Author varchar(50) 
Sales int 

我想更新銷售計數一次全部,而是基於一個子查詢。

UPDATE BookTable SET Sales = (
    -- Mixture of T-SQL and pseudo code 
    SELECT COUNT(SaleID) FROM BookSalesTable 
    WHERE LiveMode = 1 
    AND BookID = for each... 
) 

所以你可以看到我的掛斷。我之前做過這件事,只是爲了我的生活無法想起如何。我寧願不創建臨時表,因爲我很確定它在更新中處理得很好。所以我需要根據每個BookID更新所有行的計數,因爲每個行都是不同的。這可以在沒有循環的情況下完成嗎?

+0

使用一個和你的子查詢關聯到FROM子句。 –

回答

2

我上面的評論的一個例子:FROM子句

UPDATE bt 
SET Sales = (
    SELECT COUNT(SaleID) FROM BookSalesTable bst 
    WHERE bst.LiveMode = 1 
    AND bst.BookID = bt.BookID 
) 
FROM BookTable bt 
+0

謝謝!這很好! – user1447679

4
UPDATE B 
SET B.Sales = BS.Sales 
FROM BookTable B INNER JOIN 
     (SELECT BookID , COUNT(*) AS Sales 
     FROM BookSalesTable 
     WHERE LiveMode = 1 
     GROUP BY BookID)BS 
ON B.BookID = BS.BookID 
+0

這也是正確的,但是在之前的回答之後卻沒有意識到。我希望我可以將多個答案標記爲正確的。對於爲什麼這個答案比另一個更好有什麼爭議嗎?只是好奇兩者之間的邏輯差異。謝謝! – user1447679

+1

該答案執行子查詢並將內部查詢的結果集連接到outter查詢並進行更新,其中Tab Alleman的答案是使用相關子查詢,內部查詢會針對outter返回的每一行執行,一個好的DBA不會讓這段代碼進入生產環境:)我只是說 –

+0

我看到了,所以它被優化得更好,因爲它被視爲連接,並根據該結果進行更新。 Tab的查詢正在執行每個行的子查詢。我的理解是否正確? – user1447679

相關問題