如何将三条带不同过滤条件的SQL SELECT查询合并为单条语句
SQL多查询合并解决方案
报错原因
你使用的标量子查询语法要求每个子查询只能返回1行1列的结果,当任意一类transaction_type存在多条匹配记录时,子查询返回多行就会触发报错。
可选解决方案
根据实际业务需求,可以选择以下两种实现方式:
方案1:纵向合并保留所有明细行
如果需要把三个查询的所有原始结果合并为一个结果集,每行对应一条交易的计算值,使用UNION ALL实现:
SELECT 'A' AS transaction_type, (loan_amount + origination_fee) AS calculate_value FROM `Table` WHERE transaction_type = 'A' UNION ALL SELECT 'B' AS transaction_type, (stock_price + broker_fee) AS calculate_value FROM `Table` WHERE transaction_type = 'B' UNION ALL SELECT 'C' AS transaction_type, (taxable_amount + miscellaneous) AS calculate_value FROM `Table` WHERE transaction_type = 'C'
该方案的返回结果行数为三类交易的行数总和,计算列的字段类型需要保持一致
方案2:横向聚合为多列展示
如果需要将三类交易的计算结果放在同一行的不同列(可支持明细或聚合统计),使用条件聚合实现,性能远高于子查询写法:
明细场景(保留所有行,非对应类型的列返回NULL)
SELECT CASE WHEN transaction_type = 'A' THEN loan_amount + origination_fee ELSE NULL END AS column1, CASE WHEN transaction_type = 'B' THEN stock_price + broker_fee ELSE NULL END AS column2, CASE WHEN transaction_type = 'C' THEN taxable_amount + miscellaneous ELSE NULL END AS column3 FROM `Table` WHERE transaction_type IN ('A','B','C')
聚合统计场景(返回单行统计值,示例为求和,可替换为AVG/MAX等聚合函数)
SELECT SUM(CASE WHEN transaction_type = 'A' THEN loan_amount + origination_fee ELSE 0 END) AS column1, SUM(CASE WHEN transaction_type = 'B' THEN stock_price + broker_fee ELSE 0 END) AS column2, SUM(CASE WHEN transaction_type = 'C' THEN taxable_amount + miscellaneous ELSE 0 END) AS column3 FROM `Table` WHERE transaction_type IN ('A','B','C')
内容的提问来源于stack exchange,提问作者Robert Garcia
相关产品推荐
相关产品推荐

