SQL两表连接求助:关联sys_policy与sys_benefit表
解决方案:获取指定policy_id的所有benefit_line及对应金额详情
普通内连接满足不了需求,因为它只返回两张表都匹配的记录。你需要保留sys_policy里指定保单的所有benefit_line,不管sys_benefit有没有对应数据,这时候用**左连接(LEFT JOIN)**就能实现。
基础实现(基于sys_policy已有benefit_line记录)
如果sys_policy里已经包含了指定policy_id下所有1-6的benefit_line记录,直接左关联两张表即可:
SELECT sp.policy_id, sp.benefit_line, sb.amount_detail -- 替换成sys_benefit中存储金额的实际字段名 FROM sys_policy sp LEFT JOIN sys_benefit sb ON sp.policy_id = sb.policy_id AND sp.benefit_line = sb.benefit_line -- 同时关联保单ID和benefit_line,确保对应关系正确 WHERE sp.policy_id = '目标policy_id'; -- 替换成你要查询的具体保单ID
- 左连接会保留sys_policy中所有符合WHERE条件的记录
- 如果sys_benefit里没有对应保单+benefit_line的记录,金额字段会自动显示为NULL
进阶实现(强制展示1-6所有benefit_line)
如果sys_policy里可能缺失某些benefit_line值,但你需要强制展示1到6的所有行,可以先生成包含1-6的临时行集,再左关联两张表:
WITH benefit_lines AS ( SELECT 1 AS line UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 ) SELECT '目标policy_id' AS policy_id, bl.line AS benefit_line, sb.amount_detail FROM benefit_lines bl LEFT JOIN sys_policy sp ON bl.line = sp.benefit_line AND sp.policy_id = '目标policy_id' LEFT JOIN sys_benefit sb ON sp.policy_id = sb.policy_id AND bl.line = sb.benefit_line;
这个方法能确保不管sys_policy里有没有对应记录,1-6的benefit_line都会被展示,没有匹配数据时金额字段显示NULL。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

