2012-07-17 103 views
1

我想從一個表中添加count,sum和average值到另一個表,但我最終爲每個值查詢相同的數據。我正在使用PostgreSQL。我將這轉交給專家學習如何使此更新說明更有效。這是它:如何使此SQL更新語句更高效?

update "table1" set 
"col1" = (SELECT COUNT(*) FROM "table2" WHERE "table2Id" = "table1"."table1Id"), 
"col2" = (SELECT AVG("someCol") FROM "table2" WHERE "table2Id" = "table1"."table1Id"), 
"col3" = (SELECT SUM("someCol") FROM "table2" WHERE "table2Id" = "table1"."table1Id"); 

我應該能夠像這樣運行一個子查詢一次,並訪問返回值的更新,正確嗎?

SELECT COUNT(*), AVG("someCol"), SUM("someCol") FROM "table2" WHERE "table2Id" = "table1"."table1Id"; 

任何幫助,非常感謝。

+2

您使用的是哪種DBMS產品?更高性能的查詢高度依賴於這些知識。 – avgvstvs 2012-07-17 16:13:09

+0

PostgreSQL。感謝您指出這一點,我更新了這個問題。 – Gady 2012-07-17 16:14:22

+0

如果執行效果不佳,請嘗試在table2.table2id上添加索引。 – 2012-07-17 17:40:57

回答

5

嘗試一個子查詢:

UPDATE table1 
SET col1 = YourCount, col2 = YourAverage, col3 = YourSum 
FROM table1 t1 
INNER JOIN (
    SELECT table2Id, COUNT(*) AS YourCount, AVG(someCol1) YourAverage, 
     SUM(someCol2) YourSum 
    FROM table2 
    GROUP BY table2Id 
) t2 ON t1.table1Id = t2.table2Id 
+1

您必須從FROM子句中刪除table1。重複它創建笛卡爾產品。 – 2012-07-17 19:53:23

1

在PostgreSQL的近期(9.0+)版本,我相信,這是可以使用CTE更清潔尋找查詢。

WITH calculations AS 
    (SELECT table2ID, COUNT(*) AS n, SUM(someCol) AS s, AVG(someCol) AS a 
    FROM table2 
    GROUP BY table2ID) 
UPDATE table1 
SET col1=n, col2=s, col3=a 
FROM calculations WHERE calculations.table2ID=table1.table1ID;