如何在SQL多表关联查询中实现字段条件取值逻辑?
实现方法
两个字段的条件取值可以直接通过CASE表达式实现,不需要额外关联多次amou表。另外原查询存在两个可优化/修正的点:
- 关联条件存在笔误:
cove.cntr_id = cntr.cntri_id中cntri_id为拼写错误,应为cntr_id - 老式逗号隐式连接可读性差,漏写关联条件容易产生笛卡尔积,推荐替换为显式JOIN语法
最终可运行的查询语句如下:
SELECT cntr.cntr_id, cove.eff_date, cove.end_date, CASE WHEN amou.start_date = cntr.start_date THEN amou.amount END AS paid_start_date, CASE WHEN cntr.cancelled = 'No' THEN amou.amount END AS paid_curr_date FROM msa_contract cntr INNER JOIN msa_coverage cove ON cove.cntr_id = cntr.cntr_id INNER JOIN msa_amount amou ON amou.cvrg_id = cove.cvrg_id WHERE cntr.cntr_id = '1234'
补充说明
- 上述写法中,当条件不满足时字段会返回
NULL,如果你需要条件不满足时返回固定值(比如0、空字符串),可以在CASE块中补充ELSE 你的目标值,例如:CASE WHEN amou.start_date = cntr.start_date THEN amou.amount ELSE 0 END AS paid_start_date - 如果单条保障(cvrg_id)对应多条金额记录,你需要根据业务规则补充amou表的过滤条件,例如限定金额类型、时间范围,避免返回重复的合同/保障记录。
内容的提问来源于stack exchange,提问作者Nassim
相关产品推荐
相关产品推荐

