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'
您的版本中发生的情况是 B
和 C
中的不匹配行生成并填充了 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'
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'
您的版本中发生的情况是 B
和 C
中的不匹配行生成并填充了 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'