如何解决如何最小化子查询的使用
我有下表,我要计算销售额。我用一些子查询来做到这一点。我可以不使用子查询并且不使用表变量来做到这一点吗?
TableA,4 columns - popuplation pkeyP | population | city | country some data 100,1234,london,UK 101,2345,oxford,UK 102,3345,bristol,UK 103,1256,new york,USA 104,5424,LA,USA 105,100,beijing,China Table B,4 columns - sales_amount pkeyA | amount | city | country some data 200,105,UK 201,210,UK 203,23,USA 204,54,USA the city in first table may not exist in second table
webAuth.authorize(options?: AuthorizeOptions)
subquery 1 will return UK,6924 USA,6680 China,100 subquery 2 will return UK,315 USA,77 final result UK,6924,6680,77,China,null
这是一个例子。我的真实查询中有许多这样的小表,我需要先进行分组,然后再加入以进行最终计算。
我不想使用子查询,因为我的真实表具有更多的列并且真实查询非常长。它非常不可读,很难维护。
解决方法
您可以执行以下操作以将单个查询结果合并为一个
select aa.country,aa.popu,bb.amou,cc.smou from
(select sum(population) as popu,country from population group by country) aa
inner join
(select sum(amount) as amou,country from sales_amount group by countr) bb
on aa.country = bb.country inner join
(select sum(sales) as smou,country from sales_amount group by countr) cc
on bb.country = cc.country
-- inner join .. so on as you wrote....
,
编辑,好吧,那为什么不创建聚集已经完成的视图,特别是如果这是您经常使用的信息。如果您主要关注可读性,那么这会有所帮助。例如:
CREATE VIEW vw_aggregated_population AS
SELECT sum(population) AS popu,country
FROM population GROUP BY country
CREATE VIEW vw_aggregated_sales_amount AS
SELECT sum(amount) AS amou,country
FROM sales_amount GROUP BY country
之后
SELECT
vw_aggregated_population.country,popu,amou,FROM vw_aggregated_population
LEFT JOIN vw_aggregated_sales_amount
ON vw_aggregated_population.country=vw_aggregated_sales_amount.country
GROUP BY vw_aggregated_population.country
,
您可以将full join
或group by
与union all
一起使用,以获取所有表中的 all 行。这是使用第二种方法的示例:
with p as (
select sum(population) as population,country
from population
group by country
),sa as (
select sum(amount) as amount,country
from sales_amount
group by country
)
select country,max(population),max(amount)
from ((select country,population,null as amount
from p
) union all
(select country,null,amount
from sa
)
) ps
group by country;
应该清楚如何将其扩展为更多表。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。