oracle self outer join过滤记录

oracle self outer join filtering records

SELECT A.EMP_ID A_EMP_ID,
  A.EMP_CODE A_EMP_CODE,
  B.EMP_ID B_EMP_ID,
  B.EMP_CODE B_EMP_CODE,
  C.EMP_ID C_EMP_ID,
  C.EMP_CODE C_EMP_CODE,
FROM EMP A
LEFT OUTER JOIN EMP B
ON A.U_CODE =B.U_CODE
LEFT OUTER JOIN EMP C
ON A.U_CODE =C.U_CODE
WHERE A.SRC ='A'
AND B.SRC  ='B'
AND C.SRC  ='C'

对于一名员工,我有来自不同来源的数据,并且他的 ID 在所有系统中都不同。有超过 5 个不同的源系统从那里获取数据 table。 u_code 将在所有来源中保持不变。 Emp 拥有来自每个系统的每一行。

现在,我需要构建一个人行横道 table,我可以在一行中为单个员工提供所有源系统 ID。如果员工在所有三个系统中都有数据,则上述查询工作正常,但如果数据仅存在于两个系统中,则会过滤掉数据。

Table数据

empid,emp_code,src,u_code
1,ABC,A,101
2,PQR,B,101
3,XYZ,C,101
4,KPO,A,102
5,LIP,B,102

查询应该return

A_EMP_ID,A_EMP_CODE,B_EMP_ID,B_EMP_CODE,C_EMP_ID,C_EMP_CODE
1,ABC,2,PQR,3,XYZ,101
4,KPO,5,LIP,,,102

查询对 101 u_code 工作正常,但不返回 102

数据库是 Oracle 10g

当您有外部联接时,您需要注意 WHERE 子句中的条件。我想你打算:

SELECT . . .
FROM EMP A LEFT OUTER JOIN
     EMP B
     ON A.U_CODE = B.U_CODE AND B.SRC = 'B' LEFT OUTER JOIN
     EMP C
    ON A.U_CODE = C.U_CODE AND C.SRC  = 'C'
WHERE A.SRC = 'A'

您的版本中发生的情况是 BC 中的不匹配行生成并填充了 NULL 值。 NULL 值显然不满足 WHERE 条件,所以这些行被过滤掉了。效果与 INNER JOIN.

相同

当您不能保证 SRC 的任何特定值都高于 U_CODE 的任何值时,一种可能的解决方案是从 EMP 实例开始而不进行任何过滤,然后执行 LEFT JOIN 为每个可能的 SRC 值检查一次连接条件中的 SRC 值:

SELECT DISTINCT
       A.EMP_ID, A.EMP_CODE,
       B.EMP_ID, B.EMP_CODE,
       C.EMP_ID, C_EMP_CODE
FROM EMP U
LEFT OUTER JOIN EMP A ON A.U_CODE = U.U_CODE AND A.SRC = 'A'
LEFT OUTER JOIN EMP B ON B.U_CODE = U.U_CODE AND B.SRC = 'B'
LEFT OUTER JOIN EMP C ON C.U_CODE = U.U_CODE AND C.SRC = 'C'