【问题标题】:efficiency of correlated queries相关查询的效率
【发布时间】:2019-04-30 09:43:00
【问题描述】:

只是一个关于相关查询效率的问题。 假设我想针对一个名为 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,它只需要对每个custid 执行一次,例如,第一行的custoid 为1,在第一行之后,我们已经有了custid 1 的总销售额然后对于第二行,相关查询的结构似乎每次都会再次执行内部查询,无论可能重复吗?

【问题讨论】:

    标签: sql


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 2012-02-09
      相关资源
      最近更新 更多