跨多表计算匹配行乘积之和的SQL实现及JOIN优化方案
问题描述
我有一段伪SQL查询,用来展示想要实现的逻辑:
SELECT t3.ColA, t3.ColB FROM t3 WHERE t3.ColA IN (SELECT t2.ColA, t2.ColC FROM t2 WHERE t2.ColD IN (SELECT DISTINCT t1.ColD FROM t1 WHERE t1.ColE = '1234'));
现在我希望获取SUM(ColB * ColC)的结果,仅当t2.ColA = t3.ColA时才进行相乘计算。另外我知道用JOIN改写会更高效,但刚接触SQL对JOIN不太熟悉,希望得到帮助。
示例表结构及数据
t1表
| ColD | ColE |
|---|---|
| 27 | 1234 |
| 32 | 5678 |
| 46 | 9624 |
t2表
| ColA | ColC | ColD |
|---|---|---|
| 12345 | 1 | 27 |
| 26743 | 2 | 27 |
| 43621 | 3 | 27 |
| 12345 | 2 | 46 |
| 26743 | 5 | 52 |
t3表
| ColA | ColB |
|---|---|
| 12345 | 5 |
| 26743 | 10 |
| 43621 | 3 |
当查询条件为ColE='1234'时,预期输出为34——从t1筛选出ColD='27',选中t2前3行和t3前3行,计算sum(5*1, 10*2, 3*3)=34。
解决方案
用JOIN实现(推荐)
JOIN是SQL中关联多张表的常用方式,这里依次关联t1、t2、t3,筛选条件后计算总和:
SELECT SUM(t3.ColB * t2.ColC) AS total_sum FROM t1 JOIN t2 ON t1.ColD = t2.ColD JOIN t3 ON t2.ColA = t3.ColA WHERE t1.ColE = '1234';
逻辑说明:
JOIN t2 ON t1.ColD = t2.ColD:将t1和t2通过ColD关联,筛选出t1中ColE='1234'对应的t2数据;JOIN t3 ON t2.ColA = t3.ColA:将关联后的结果与t3通过ColA关联,确保只有t2和t3中ColA匹配的行参与计算;SUM(t3.ColB * t2.ColC):对匹配行的ColB*ColC结果求和,得到最终数值。
用子查询实现(贴合原思路)
如果暂时不习惯JOIN,可基于原伪SQL思路修改(注意原伪SQL中IN子查询返回两列是错误的,需调整):
SELECT SUM(t3.ColB * t2.ColC) AS total_sum FROM t3 JOIN t2 ON t3.ColA = t2.ColA WHERE t2.ColD IN ( SELECT DISTINCT t1.ColD FROM t1 WHERE t1.ColE = '1234' );
或者用嵌套子查询的方式:
SELECT SUM(ColB * ColC) AS total_sum FROM ( SELECT t3.ColB, t2.ColC FROM t3 JOIN t2 ON t3.ColA = t2.ColA WHERE t2.ColD IN ( SELECT DISTINCT t1.ColD FROM t1 WHERE t1.ColE = '1234' ) ) AS temp_table;
验证结果
用示例数据执行上述查询,都会得到预期的34,符合需求。
内容的提问来源于stack exchange,提问作者user7062641
相关产品推荐
相关产品推荐

