You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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参数

逻辑说明:

  1. 以SKILL表为基础,左连接DOCCHECK表,关联条件为技能ID匹配且DOCCHECK中的用户编号等于输入值
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 08:20:00