Oracle查询需求:替换Table2中非数值的supid字段值(类社区线程但有差异)
解决方案:替换Table2中非数值的supid字段
根据你的需求,我们可以通过两种方式实现:一是查询替换后的结果,二是直接更新Table2的字段。以下是具体的Oracle SQL语句:
方式一:查询替换后的结果
如果你只是想查看替换后的数据集,无需修改原表,可以使用这个查询:
SELECT t2.empID, t2.emplyactive, CASE -- 当supid为"-"时,用Table1中当前活跃员工的mgrid替换 WHEN t2.supid = '-' THEN NVL(t1_current.mgrid, '-') -- 非"-"的数值保持不变 ELSE t2.supid END AS updated_supid FROM Table2 t2 -- 左连接Table1中当前生效的员工记录(employeeactive=1且dateto为空表示至今有效) LEFT JOIN ( SELECT empID, mgrid FROM Table1 WHERE employeeactive = 1 AND dateto IS NULL ) t1_current ON t2.empID = t1_current.empID;
关键说明:
- 子查询
t1_current筛选出Table1中当前活跃的员工记录,确保我们获取的是最新的直属领导ID。 LEFT JOIN保证Table2中所有员工都被包含,即使某些员工在Table1中没有对应活跃记录(此时保留原"-"值)。
方式二:直接更新Table2的supid字段
如果需要永久修改Table2中的数据,将"-"替换为对应的mgrid,可以使用UPDATE语句:
UPDATE Table2 t2 SET supid = ( SELECT mgrid FROM Table1 t1 WHERE t1.empID = t2.empID AND t1.employeeactive = 1 AND t1.dateto IS NULL ) WHERE t2.supid = '-' -- 仅更新Table1中存在对应活跃记录的员工,避免无匹配的"-"被设为NULL AND EXISTS ( SELECT 1 FROM Table1 t1 WHERE t1.empID = t2.empID AND t1.employeeactive = 1 AND t1.dateto IS NULL );
关键说明:
- 内层SELECT精准定位对应员工的当前直属领导ID。
WHERE t2.supid = '-'限定只处理非数值的"-"字段。EXISTS子句确保只有存在有效领导记录的员工才会被更新,避免无效替换。
内容的提问来源于stack exchange,提问作者JOHNPaul
相关产品推荐
相关产品推荐

