净现值查询:查不到就当 0
LeetCode 1421 · 复合键 LEFT JOIN、默认值
面试怎么回答
Queries LEFT JOIN NPV ON id 和 year 都相等,IFNULL(npv, 0)。复合键关联要把所有键都写进 ON,漏一个就会产生错误的多对多匹配。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
NPV 表记录每个存货 ID 在某年的净现值,查询表是一批(ID, 年份)查询。返回每条查询对应的净现值,NPV 表里没有的记为 0。
表结构
- NPV:id、year、npv;(id, year) 为主键
- Queries:id、year;(id, year) 为主键
思路
以查询表为主表,按(ID, 年份)两个字段 LEFT JOIN NPV 表,没有匹配的用 IFNULL 补 0。
参考解法
select q.id,q.year,ifnull(npv,0) npv
from Queries q left join NPV n
on q.id = n.id and q.year = n.year
易错点
- 只按 id 关联会匹配到其他年份的净现值。