将含嵌套SELECT子查询的SQL语句改写为JOIN语句的技术咨询
SQL改写方案
改写思路
原语句为关联子查询实现:统计每个银行名下所有贷款类型账户的总余额,无对应贷款账户的银行总余额返回0。改写时使用LEFT JOIN保证所有银行记录都被保留,避免丢失无贷款账户的银行数据。
改写后SQL
SELECT bank.bank_name, COALESCE(SUM(account.balance), 0) AS total FROM bank LEFT JOIN account ON account.bank_name = bank.bank_name AND account.account_type = 'loan' GROUP BY bank.bank_name
注意事项
- 禁止替换为
INNER JOIN,否则无贷款账户的银行会被直接过滤,与原语句输出结果不一致 account.account_type = 'loan'过滤条件必须写在JOIN的ON子句中,不能写在WHERE子句里,否则LEFT JOIN会退化为等效INNER JOIN,同样会丢失无贷款账户的银行记录- 分组字段为
bank.bank_name,保证每个银行对应唯一一条统计结果 COALESCE用于将无匹配贷款账户时SUM返回的NULL值转为0,完全对齐原语句的逻辑
内容的提问来源于stack exchange,提问作者M Mohsin Mahar
相关产品推荐
相关产品推荐

