Sql oracle自外部联接筛选记录

Sql oracle自外部联接筛选记录,sql,oracle,left-join,Sql,Oracle,Left Join,对于一名员工,我有来自不同来源的数据,他的id在所有系统中都不同。有5个以上不同的源系统,数据从这些系统进入此表。 u_代码将在所有源中保持不变。Emp拥有每个系统的每一行 现在,我需要构建一个交叉表,在其中的一行中,我可以为单个员工提供所有源系统id。若员工在所有三个系统中都有数据,但若数据只存在于两个系统中,则上述查询可以正常工作 表数据 SELECT A.EMP_ID A_EMP_ID, A.EMP_CODE A_EMP_CODE, B.EMP_ID B_EMP_ID, B.E

对于一名员工,我有来自不同来源的数据,他的id在所有系统中都不同。有5个以上不同的源系统,数据从这些系统进入此表。 u_代码将在所有源中保持不变。Emp拥有每个系统的每一行

现在,我需要构建一个交叉表,在其中的一行中,我可以为单个员工提供所有源系统id。若员工在所有三个系统中都有数据,但若数据只存在于两个系统中,则上述查询可以正常工作

表数据

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'
查询应返回

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
对于101 u_代码,查询工作正常,但不返回102


数据库是Oracle10g

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

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

在您的版本中发生的情况是,
B
C
中不匹配的行被生成,并填充
NULL
NULL
值显然不符合
WHERE
条件,因此这些行被过滤掉。其效果与执行
内部联接的效果相同

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

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

在您的版本中发生的情况是,
B
C
中不匹配的行被生成,并填充
NULL
NULL
值显然不符合
WHERE
条件,因此这些行被过滤掉。其效果与执行
内部联接的效果相同

当您不能保证SRC的任何特定值对任何U_代码值都有效时,一种可能的解决方案是从EMP实例开始,不进行任何筛选,然后对SRC的每个可能值执行一次
左联接,检查联接条件中的SRC值:

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'

当您无法保证SRC的任何特定值先于U_代码的任何值时,一种可能的解决方案是从EMP实例开始,不进行任何筛选,然后对SRC的每个可能值执行一次左连接,检查连接条件中的SRC值:

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'

谢谢,很好用。但现在它返回的记录,如果它存在于一个来源。如果记录不存在A,则它不会返回B和C源,因为我的初始问题是由您的管理员处理的,因此选择了您的问题。我选择了pivot,因为它的功能非常好。但现在它返回的记录,如果它存在于一个来源。如果记录不存在A,则它不会返回B和C源,因为我的初始问题是由您的管理员处理的,因此选择了您的问题。我已经为这个功能选择了pivot谢谢。这将产生预期的结果。然而,我选择了pivot函数。投票表决你的答案谢谢。这将产生预期的结果。然而,我选择了pivot函数。向上投票您的答案仅为其他用户,我已使用oracle pivot功能满足此要求。使工作更容易。仅对其他用户而言,我使用了oracle pivot函数来满足此需求。这使工作容易多了。