Oracle SQL查询需求:根据usernum和skill获取checknum
数据库查询需求实现
需求说明
现有两张数据表:
- DOCCHECK:包含字段
skill(技能ID)、usernum(用户编号)、checknum(校验编号) - SKILL:包含字段
skill(技能ID)、checknum(校验编号)
需实现逻辑:根据输入的用户编号(usernum)和技能ID(skill),优先返回DOCCHECK表中匹配该用户编号和技能ID的校验编号;若不存在匹配记录,则返回SKILL表中对应技能ID的校验编号。
示例数据表
DOCCHECK表
+-------+----------+-----------+ | skill | usernum | checknum | +-------+----------+-----------+ | 1 | 111 | 30 | | 2 | 222 | 99 | | 3 | 111 | 4 | +-------+----------+-----------+
SKILL表
+-------+-----------+ | skill | checknum | +-------+-----------+ | 1 | 4 | | 2 | 30 | | 3 | 50 | | 4 | 2 | +-------+-----------+
预期结果
- 输入用户编号:333,技能ID:3 → 返回校验编号:50
- 输入用户编号:222,技能ID:2 → 返回校验编号:99
- 输入用户编号:222,技能ID:3 → 返回校验编号:50
解决方案
高效实现(左连接+COALESCE)
这种方式仅需一次关联查询,性能更优:
SELECT COALESCE(d.checknum, s.checknum) AS checknum FROM SKILL s LEFT JOIN DOCCHECK d ON s.skill = d.skill AND d.usernum = ? -- 传入用户编号参数 WHERE s.skill = ?; -- 传入技能ID参数
逻辑说明:
- 以SKILL表为基础,左连接DOCCHECK表,关联条件为技能ID匹配且DOCCHECK中的用户编号等于输入值
- 使用
COALESCE函数优先取DOCCHECK的校验编号,若DOCCHECK无匹配记录(d.checknum为NULL),则取SKILL的校验编号
备选方案(CASE WHEN+EXISTS)
若需要更直观的逻辑判断,可使用CASE语句:
SELECT CASE WHEN EXISTS ( SELECT 1 FROM DOCCHECK WHERE skill = ? AND usernum = ? ) THEN ( SELECT checknum FROM DOCCHECK WHERE skill = ? AND usernum = ? ) ELSE ( SELECT checknum FROM SKILL WHERE skill = ? ) END AS checknum;
注意:该方式会多次查询数据表,性能略低于左连接方案,适合小数据量场景。
内容的提问来源于stack exchange,提问作者liorke
相关产品推荐
相关产品推荐

