Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle 18c-左连接条件使用子句_Sql_Oracle_Join_Oracle18c - Fatal编程技术网

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列?