为什么SQL不提供多次迭代查询结果的函数。我们可能有窗口功能。但它们是开箱即用的解决方案。我需要通用迭代函数。
让我详细解释一下,
假设示例查询和结果如下
select product p ,sum(sales) S
from Data group by product
返回:
Product,sum(sales)
coffee,10
EnergyDrink,30
Tea,20
假设我需要获得每种产品的其他产品总销售额的总和。例如,在咖啡销售方面,我需要在其他专栏中单独总结茶和能量饮料销售
product | sum sales | other sales
coffee | 10 | 50 <30 +20>
EnergyDrink | 30 | 30 <10 (coffee)+20(tea)>
Tea | 20 | 40 <10+30>
要在mysql中实现这一点,
我需要的查询是,
select T1.p,T1.S,sum(T2.S) from
(select product p ,sum(sales) S from Data group by product) T1
JOIN
(select product p ,sum(sales) S from Data group by product) T2
on T1.p!=T2.p and T1.S != T2.S group by 1,2
解释查询如下,
在mysql中执行会创建3个派生的临时表,
但是在编程方面我需要迭代
的结果从数据分组中选择产品p,总和(销售额)S
再次在内循环中。说3 * 3迭代。代码方式如下
for(int i=0;i<3;i++)
{
int otherSales = 0;
for(int j=0;j<3;j++)
{
if(data[j].product != data[i].product) // if product is not same
{
otherSales += data[j].sales; // add that sales to other sales
}
}
}
我建议在SQL中进行迭代行为,
假设SQL支持迭代函数,它允许再次迭代结果集。和特殊功能OUTER,可以访问外部循环访问('第i个循环中'产品的循环值')。如果我们有,我们可以使用下面的SQL,
select product p ,sum(sales) S ,
sum(iterate(if(outer(p)!=p,S,NULL)))
from Data group by product
这里迭代函数再次迭代结果集, outer(p)允许在outerscope中访问产品p
MS Power Pivot的DAX提供了这样一个功能EARLIER
如果我们在SQL中有类似的功能,它将有助于BI功能。
SQL有LEAD,LAG,RANK等。但它们是开箱即用的SQL窗口函数,它支持一级迭代。我的建议是用于通用迭代函数,它可以用于许多目的。
我的问题是我们是否需要 ITERATION 功能?或者数据库将使用智能处理这种复杂的嵌套(第一个涉及2级联接的示例sql)。如何在Postgres,oracle等中执行此类查询的当前场景?它不会创建与派生表相同的结果集的多个副本吗?