Sql Oracle 18c-左连接条件使用子句
我有一个左连接的游标,如下所示:Sql Oracle 18c-左连接条件使用子句,sql,oracle,join,oracle18c,Sql,Oracle,Join,Oracle18c,我有一个左连接的游标,如下所示: CURSOR c_emp SELECT * FROM FROM EMP_NEW LEFT JOIN (SELECT EMP_ID, DEPT_ID, SUB_DEPT_ID, EMP_UID, FROM EMP) USING (DEPT_ID, SUB_DEPT_ID, EMP_UID); 然后在for循环中引用: For i in c_
CURSOR c_emp
SELECT * FROM FROM EMP_NEW
LEFT JOIN
(SELECT EMP_ID,
DEPT_ID,
SUB_DEPT_ID,
EMP_UID,
FROM EMP)
USING (DEPT_ID, SUB_DEPT_ID, EMP_UID);
然后在for循环中引用:
For i in c_emp
IF i.emp_id IS NULL
then
insert into emp...
else
update emp...
where emp_id = i.emp_id;
end if;
当从EMP_new
表将新数据加载到EMP
表中时,我们有一个场景,EMP_new.dept_id
和EMP_new.EMP_uid
可以在EMP
表中使用不同的sub_dept_id
值进行复制。当我们获得这样的新数据时,光标中没有选择emp.emp\u id
,因此逻辑转到INSERT
,而不是UPDATE
。我希望选择重复的emp\u id
,以便它进入更新
环境管理计划数据:
EMP_ID DEPT_ID SUB_DEPT_ID EMP_UID
123 1 10 123.123
EMP_新数据:
DEPT_ID SUB_DEPT_ID EMP_UID
1 20 123.123
上述光标当前返回以下内容:
EMP_ID DEPT_ID SUB_DEPT_ID EMP_UID
null 1 20 123.123
我希望它返回的内容:
EMP_ID DEPT_ID SUB_DEPT_ID EMP_UID
123 1 20 123.123
您似乎希望首先匹配3列,如果不匹配,则只匹配两列。我认为横向连接更适合您的需要:
SELECT en.*, e.*
FROM EMP_NEW en LEFT JOIN LATERAL
(SELECT EMP_ID
FROM EMP e
WHERE en.DEPT_ID = e.DEPT_ID AND en.EMP_UID = e.EMP_UID
ORDER BY (CASE WHEN en.SUB_DEPT_ID = e.SUB_DEPT_ID THEN 1 ELSE 2 END)
FETCH FIRST 1 ROW ONLY -- presumably you want only one row either way
) e
不清楚你想做什么。示例数据和预期结果将有所帮助。似乎
使用(部门ID,EMP\u UID)
必须符合您的需要。为什么您不能删除子部门ID?请参阅添加的信息谢谢,但是我添加了更多信息以澄清混淆。请参见编辑。@user3224907。上面返回的版本首先具有相同的子部门id。如果您想要另一个,只需将order by
颠倒即可。请您解释一下这个逻辑order by(当en.SUB\u DEPT\u ID=e.SUB\u DEPT\u ID然后1个ELSE 2 END)
选择子部门匹配的行作为第一行。我不确定您是要第一个还是最后一个。我认为如果您想按2排序,您需要在左侧联接查询中选择至少2列?