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

获取组织层级数据的SQL查询问题:无法得到预期输出

问题分析与SQL修正

原SQL的核心问题

  1. 表连接对象错误:你原本用left join test t2自连接了表1,但实际应该连接存储cost_center和domain映射关系的表2,而非表1自身。
  2. 逻辑条件可能不符合数据场景:你的CASE WHEN条件是判断当前员工的l3_mgr_id/l4_mgr_id等于自己的badge(即员工自己是自己的L3/L4经理),如果数据中不存在这类记录,自然会返回空结果。

针对需求的修正方案

方案1:按原需求逻辑(员工自己是自身L3/L4经理)

如果你的需求确实是筛选出自己担任自身L3/L4经理的员工,并关联表2的成本中心信息,修正后的SQL如下:

SELECT DISTINCT
    CASE WHEN t1.l3_mgr_id = t1.badge THEN t1.l3_mgr_id ELSE NULL END AS l3_mgr_id,
    CASE WHEN t1.l3_mgr_id = t1.badge THEN t1.l3_mgr_name ELSE NULL END AS l3_mgr_name,
    CASE WHEN t1.l4_mgr_id = t1.badge THEN t1.l4_mgr_id ELSE NULL END AS l4_mgr_id,
    CASE WHEN t1.l4_mgr_id = t1.badge THEN t1.l4_mgr_name ELSE NULL END AS l4_mgr_name,
    t1.cost_center,
    t2.domain
FROM 表1 t1
LEFT JOIN 表2 t2 ON t1.cost_center = t2.cost_center
-- 可选:只保留有符合条件记录的行
WHERE (t1.l3_mgr_id = t1.badge OR t1.l4_mgr_id = t1.badge)

方案2:修正为筛选作为他人L3/L4经理的员工

如果你的真实需求是找出那些被其他员工当作L3/L4经理的员工(更符合实际业务场景),可以用以下SQL实现:

-- 获取所有作为他人L3经理的员工信息
SELECT DISTINCT
    m.badge AS l3_mgr_id,
    m.l3_mgr_name AS l3_mgr_name,
    NULL AS l4_mgr_id,
    NULL AS l4_mgr_name,
    m.cost_center,
    t2.domain
FROM 表1 e
JOIN 表1 m ON e.l3_mgr_id = m.badge
LEFT JOIN 表2 t2 ON m.cost_center = t2.cost_center

UNION

-- 获取所有作为他人L4经理的员工信息
SELECT DISTINCT
    NULL AS l3_mgr_id,
    NULL AS l3_mgr_name,
    m.badge AS l4_mgr_id,
    m.l4_mgr_name AS l4_mgr_name,
    m.cost_center,
    t2.domain
FROM 表1 e
JOIN 表1 m ON e.l4_mgr_id = m.badge
LEFT JOIN 表2 t2 ON m.cost_center = t2.cost_center

内容的提问来源于stack exchange,提问作者user26309744

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:12:17