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个不同的源系统,数据来自此表。 u_code将在所有来源中保持相同。 Emp正在拥有每个系统的每一行。
现在,我需要构建一个交叉遍历表,在一行中我可以为单个员工提供所有源系统ID。如果员工在所有三个系统中都有数据,但如果数据只存在于两个系统中,那么上面的查询工作正常。
表格数据
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
查询应返回
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
答案 0 :(得分:1)
如果有外连接,则需要注意docker-compose up
子句中的条件。我想你打算:
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
相同。
答案 1 :(得分:1)
如果您不能保证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'