我在PostgreSQL數據庫中有一個相當複雜的SQL語句,我在幾個視圖中使用它作爲基礎。但是在這個語句中,總和聚合函數被稱爲多次。我現在試圖通過使用一個變量多次刪除彙總這些值來優化這些視圖。PostgreSQL使用select語句中的值作爲該語句中的變量
我知道我可以使用@myvalue = 1,但這是在pgScript中,它不能在視圖中使用,因爲它是pgScript。
我已閱讀有關濫用配置設置來存儲變量,但我不知道這是如何玩視圖,我不喜歡這樣的黑客。
我想存儲在變量中的SQL部分是sum(v."Surface")::double precision
,它重複多次。
如果有任何其他建議來優化這個SQL我完全贊成。
CREATE OR REPLACE VIEW mydb."MyTable" AS
SELECT p."Id",
v."FunctionInt",
v."TypeInt",
sum(v."Surface") AS "SurfaceTotaal",
round((sum(v."Surface"::double precision * v."Average")/sum(v."Surface")::double precision)::numeric, 1) AS "Average",
round((sum(v."Surface"::double precision * v."E")/sum(v."Surface")::double precision)::numeric, 1) AS "E",
round((sum(v."Surface"::double precision * v."E1")/sum(v."Surface")::double precision)::numeric, 1) AS "E1",
round((sum(v."Surface"::double precision * v."E2")/sum(v."Surface")::double precision)::numeric, 1) AS "E2",
round((sum(v."Surface"::double precision * v."E3")/sum(v."Surface")::double precision)::numeric, 1) AS "E3",
round((sum(v."Surface"::double precision * v."M")/sum(v."Surface")::double precision)::numeric, 1) AS "M",
round((sum(v."Surface"::double precision * v."M1")/sum(v."Surface")::double precision)::numeric, 1) AS "M1",
round((sum(v."Surface"::double precision * v."M2")/sum(v."Surface")::double precision)::numeric, 1) AS "M2",
round((sum(v."Surface"::double precision * v."M3")/sum(v."Surface")::double precision)::numeric, 1) AS "M3",
round((sum(v."Surface"::double precision * v."G")/sum(v."Surface")::double precision)::numeric, 1) AS "G",
round((sum(v."Surface"::double precision * v."G1")/sum(v."Surface")::double precision)::numeric, 1) AS "G1",
round((sum(v."Surface"::double precision * v."G2")/sum(v."Surface")::double precision)::numeric, 1) AS "G2",
round((sum(v."Surface"::double precision * v."G3")/sum(v."Surface")::double precision)::numeric, 1) AS "G3",
round((sum(v."Surface"::double precision * v."G4")/sum(v."Surface")::double precision)::numeric, 1) AS "G4"
FROM mydb."PTable" p,
LATERAL (
SELECT
v."Id",
v."Surface",
v."FunctionInt",
v."TypeInt",
r."YearGroupInt",
r."Average",
r."En" AS "E",
r."En1" AS "E1",
r."En2" AS "E2",
r."En3" AS "E3",
r."Mi" AS "M",
r."Mi1" AS "M1",
r."Mi2" AS "M2",
r."Mi3" AS "M3",
r."Gz" AS "G",
r."Gz1" AS "G1",
r."Gz2" AS "G2",
r."Gz3" AS "G3",
r."Gz4" AS "G4"
FROM mydb."VTable" v
JOIN mydb."RTable" r ON
v."FunctionInt" = r."FunctionInt"
AND v."TypeInt" = r."TypeInt"
AND v."YearGroupInt" = r."YearGroupInt"
WHERE v."PId" = p."Id") v
GROUP BY p."Id", v."FunctionInt", v."TypeInt";
'創建函數(var)返回表??.. –
你不需要「優化」這個SQL。即使這個'sum(v。「Surface」)'在你的查詢中出現了1000次,優化器也足夠聰明,並且知道這是相同的值,並且只計算一次**,而不是1000次。 – krokodilko
@krokodilko,我很希望能有這樣的事情,很好,這幾乎可以回答我的問題,除了我想要擺脫的衆多演員之外,還有其他建議嗎? –