Trazer registros com campos de outra tabela

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
pnet1
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 23 Jan 2020 9:12 pm

Uma ajuda. Tenho duas tabelas que irão se relacionar. Bem, tenho essas tabelas:
EMPREGADOS
UNIDADE_OPERACIONAL.

Na tabela EMPREGADOS, eu preciso pegar o FUNCIONÁRIO e seu GESTOR. Acontece que apenas na tabela EMPREGADOS eu não consigo. Logo a tabela empregados eu tenho o campo CHAPA, que é uma espécie de ID do empregado. Nessa tabela ainda, tenho um campo chamado FKND_UO que é o campo equivalente na tabela UNIDADE_OPERACIONAL. Nessa tabela sim, tenho o FUNCIONÁRIO e o seu GESTOR. Nela tem o campo PKSF_UO(PK) e tem o campo FKND_SUPERIOR_HIER. Esse campo determina o GESTOR da UO, que pode ser pego na tabela EMPREGADOS pelo campo FKND_UO . Só que no meu join não consigo pegar o cara. Essa é a query completa

Selecionar tudo

SELECT 
           COMP2.PKSF_COMP_ORGAN AS COD_UO,
           COMP2.ATSF_CO_PORT_EXT AS DESC_UO,
           COMP2.FKSF_SUPERIOR_HIER AS COD_SUP,
           CASE
              WHEN COMP2.FKSF_FUNCAO_NIVEL = EMP.FKSF_FUNCAO  THEN 1
           END
              AS SUPERIOR,
           QUAL.PKSF_FUNCAO_NIVEL AS COD_CARGO,
           QUAL.ATND_FUNCAO_SAP AS COD_CARGO_SAP,
           NVL(QUAL.ATSF_FUN_PORT_EXT, 'NÃO CADASTRADO') AS DESC_CARGO,
           EMP.PKSF_CHAPA AS COD_FUNC,
           EMP.ATSF_NOME AS DESC_FUNC, 
           GE.ATSF_NOME AS GESTOR,
           NVL(E.ATSF_GRAU, EMP.FKSF_GRAU) AS GRAU_FUNC,
              EMP.ATND_SALAR1 AS SAL_ATUAL,
           COMP2.NIVEL
        FROM     
        ( 
            SELECT PKSF_CHAPA, ATSF_NOME, FKSF_FUNCAO, FKND_COMP_ORGAN, ATDT_DEMISSAO, ATND_SALAR1, FKSF_GRAU
            FROM PANA101V_EMPREGADO
            WHERE PKSF_CHAPA NOT IN(    SELECT PKND_NUMERO_PESSOAL 
                                        FROM TAKB132T_EMPREGADO_AFASTAMENTO 
                                        WHERE FKND_MOTIVO IN(6, 7) AND SYSDATE BETWEEN ATDT_DE AND ATDT_ATE)
            UNION ALL
            (SELECT '999', 'POSIÇÃO NÃO OCUPADA', '999',COMP2.PKSF_COMP_ORGAN, NULL, NULL, NULL 
            FROM 
               DUAL, (    SELECT   COMP.PKSF_COMP_ORGAN,
                        COMP.ATSF_CO_PORT_EXT,
                        CASE
                        WHEN COMP.PKSF_COMP_ORGAN <> 20061607 THEN  NVL(TRIM(COMP.FKSF_FUNCAO_NIVEL), 999)
                        END AS FKSF_FUNCAO_NIVEL,
                        COMP.FKSF_SUPERIOR_HIER,
                        LEVEL AS NIVEL,
                        COMP.ATSF_DT_CANCEL_CO
                 FROM   PANA004T_COMPONENT COMP
                --WHERE   COMP.ATSF_DT_CANCEL_CO = 0
           CONNECT BY   PRIOR COMP.PKSF_COMP_ORGAN = COMP.FKSF_SUPERIOR_HIER
           START WITH   COMP.PKSF_COMP_ORGAN = NVL(20047213 ,20061607)) COMP2
           
           WHERE COMP2.FKSF_FUNCAO_NIVEL = '999'
           AND   COMP2.ATSF_DT_CANCEL_CO = 0)
            )      EMP
            
            LEFT JOIN(SELECT EMP.ATSF_NOME, EMP.PKSF_CHAPA FROM PANA101V_EMPREGADO EMP 
                      LEFT JOIN PANA004T_COMPONENT C ON EMP.FKND_COMP_ORGAN = C.FKSF_SUPERIOR_HIER)GE ON EMP.PKSF_CHAPA = GE.PKSF_CHAPA
            
        LEFT JOIN TAKB100T_EMPREGADO E ON E.PKND_NUMERO_PESSOAL = EMP.PKSF_CHAPA
              LEFT JOIN
                 PANA001T_QUALIFICA QUAL
              ON EMP.FKSF_FUNCAO = QUAL.PKSF_FUNCAO_NIVEL
           RIGHT JOIN
               (    SELECT   COMP.PKSF_COMP_ORGAN,
                        COMP.ATSF_CO_PORT_EXT,
                        CASE
                        WHEN COMP.PKSF_COMP_ORGAN <> 20061607 THEN  NVL(TRIM(COMP.FKSF_FUNCAO_NIVEL), 999)
                        END AS FKSF_FUNCAO_NIVEL,
                        COMP.FKSF_SUPERIOR_HIER,
                        LEVEL AS NIVEL,
                        COMP.ATSF_DT_CANCEL_CO
                 FROM   PANA004T_COMPONENT COMP
                WHERE   COMP.ATSF_DT_CANCEL_CO = 0
           CONNECT BY   PRIOR COMP.PKSF_COMP_ORGAN = COMP.FKSF_SUPERIOR_HIER
           START WITH   COMP.PKSF_COMP_ORGAN = NVL(20047213 ,20061607)) COMP2
           
           ON COMP2.PKSF_COMP_ORGAN = EMP.FKND_COMP_ORGAN 
           
           LEFT JOIN(SELECT EMP.ATSF_NOME, EMP.PKSF_CHAPA, EMP.FKND_COMP_ORGAN FROM PANA101V_EMPREGADO EMP 
             WHERE EMP.FKND_COMP_ORGAN IN(SELECT DISTINCT C.FKSF_SUPERIOR_HIER FROM PANA004T_COMPONENT C))GE 
             ON EMP.PKSF_CHAPA = GE.PKSF_CHAPA AND GE.FKND_COMP_ORGAN = COMP2.PKSF_COMP_ORGAN
           
           
        WHERE   ( QUAL.PKSF_FUNCAO_NIVEL NOT IN ( 'MU2', '8WY')  OR  QUAL.PKSF_FUNCAO_NIVEL IS NULL )
          AND   COMP2.ATSF_DT_CANCEL_CO = 0
    ORDER BY    COMP2.NIVEL, COMP2.ATSF_CO_PORT_EXT, SUPERIOR;
Porem esse JOIN

Selecionar tudo

 LEFT JOIN(SELECT EMP.ATSF_NOME, EMP.PKSF_CHAPA FROM PANA101V_EMPREGADO EMP 
                      LEFT JOIN PANA004T_COMPONENT C ON EMP.FKND_COMP_ORGAN = C.FKSF_SUPERIOR_HIER)GE ON EMP.PKSF_CHAPA = GE.PKSF_CHAPA
dentro da query principal, não rola. Como eu consigo trazer na query o gestor passando o código dentro da tabela UNIDADE_OPERACIONAL para a EMPREGADOS?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Temos:
Empregado.chapa (id do empregrado)
Empregado.FKND_UO (unidade operacional).
Unidade_Operacional.PKSF_UO (pk)
Unidade_Operacional.funcionario
Unidade_Operacional.FKND_SUPERIOR_HIER (gestor da UO -- relaciona com Empregado.FKND_UO)

Eu tentaria:

Selecionar tudo

SELECT e.*
, (select e1.chapa 
   from 
     empregado e1
   , unidade_operacional uo 
   where uo.FKND_SUPERIOR_HIER = e1.FKND_UO
     and uo.PKSF_UO            = e.FKND_UO 
  ) gestor
FROM
  empregado e
Responder
  • Informação