如何重用已計算的SELECT列?
當前查詢
SELECT
SUM(Mod),
SUM(Mod) - SUM(Spent)
FROM
tblHelp
GROUP BY
SourceID
偽查詢
SELECT
SUM(Mod),
USE ALREADY CALCULATED VALUE - SUM(Spent)
FROM
tblHelp
GROUP BY
SourceID
問題:既然SUM(Mod)已經計算過了,我可以把它放在臨時變數中并在SELECT子句的其他列中使用它嗎?這樣做會提高SQL查詢的效率嗎?
uj5u.com熱心網友回復:
你不能,至少不能直接。您可以使用諸如使用派生表或 cte 之類的技巧,cross apply但您不能select在同一select子句中的子句中使用計算出的值。
例子:
SELECT SumMode, SumMode - SumSpent
FROM
(
SELECT
SUM(Mod) As SumMode,
SUM(Spent) As SumSpent
FROM tblHelp GROUP BY SourceID
) As DerivedTable;
它可能不會提高性能,但對于復雜的計算,它可以幫助提高代碼清晰度。
uj5u.com熱心網友回復:
子查詢可以為您執行此操作,但它不會對 sql server 產生任何影響。如果您認為這會使查詢比繼續操作更具可讀性,這里是一個示例
select t.modsum,
t.modsum - t.modspent
from ( SELECT SUM(Mod) as modsum,
SUM(Spent) as modspent
FROM tblHelp
GROUP BY SourceID
) t
但是,這對你來說是否比
SELECT
SUM(Mod),
SUM(Mod) - SUM(Spent)
FROM tblHelp GROUP BY SourceID
恕我直言,我沒有發現第一個查詢更具可讀性。當查詢變得更大和更復雜時,這可能會改變。
性能不會有任何改善,因此這樣做的唯一原因是讓您更清晰/可讀
uj5u.com熱心網友回復:
SQL Server 有一個非常智能的查詢決議器,所以雖然我無法證明它,但如果它不是只計算一次,我會感到非常驚訝。但是,您可以通過以下方式確保它:
select x.SourceId, x.Mod, x.Mod - x.Spent
from
(
select SourceId, sum(Mod) Mod, sum(Spent) Spent
from tblHelp
group by SourceId
) x
)
uj5u.com熱心網友回復:
其他答案已經涵蓋了一些很好的基礎,但請注意:
當然,您不應該
select進入 a@variable以“保存”一筆總和,然后select在您的表上與該值一起創建一個新值,因為您將掃描表兩次。我理解人們如何通過思考低級(CPU 操作)來嘗試優化性能,這會導致您考慮避免額外的求和。然而,SQL Server 是一個不同的野獸。你必須學會??閱讀執行計劃,以及所涉及的資料頁。如果您的代碼避免了不必要的頁面讀取,則執行更多的 CPU 作業(即使發生這種情況)通常可以忽略不計。用外行的話來說你的情況:如果表只有幾行,它可能不值得考慮。如果它有很多,從磁盤讀取這些頁面的全部(并由于
groupingby如果不存在索引而對它們進行排序)將花費 99.99% 的時間相對于添加和的值
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/380042.html
標籤:sql sql-server 查询语句
