只是有关查询效率的一个问题。 假设我要针对名为O1的OrderValues视图实例编写外部查询;在SELECT列表中,将当前值除以一个相关子查询的结果,该子查询返回第二个OrderValues实例的总值,该实例称为O2,用于当前客户。这是完整的解决方案查询。
SELECT orderid, custid, val,
CAST(100. * val / (SELECT SUM(O2.val)
FROM Sales.OrderValues AS O2
WHERE O2.custid = O1.custid)
AS NUMERIC(5,2)) AS pct
FROM Sales.OrderValues AS O1
ORDER BY custid, orderid;
orderid custid val pct
----------- ----------- ---------- ------
10643 1 814.50 19.06
10692 1 878.00 20.55
10702 1 330.00 7.72
10835 1 845.80 19.79
10952 1 471.20 11.03
11011 1 933.50 21.85
10308 2 88.80 6.33
10625 2 479.75 34.20
10759 2 320.00 22.81
10926 2 514.40 36.67
但是对于查询SELECT SUM(O2.val) FROM Sales.OrderValues AS O2 WHERE O2.custid = O1.custid
,它仅需对每个商誉执行一次,例如,商誉为1的第一行,在第一行之后,我们已经拥有商誉1的总销售额,对于第二行,无论是否重复,相关查询的结构似乎每次都会再次执行内部查询。
答案 0 :(得分:1)
这称为相关子查询,它可以提高效率-尤其是在使用正确索引的情况下。
但这最好使用窗口函数编写:
SELECT orderid, custid, val,
CAST(100. * val / SUM(SUM(O2.val)) OVER (PARTITION BY custid) AS NUMERIC(5,2)) AS pct
FROM Sales.OrderValues ov
ORDER BY custid, orderid;