Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Alinerdl

Outer Join

Recommended Posts

Olá!Eu tenho o seguinte SELECT que será utilizado em uma View:SELECT T3.NAME CONCORRENTE, T4.OU_NUM NUM_CONTA, T4.NAME CONTA, T1.ROW_ID OPTY, T5.OU_NUM NUM_CONGLOMERADO, T5.NAME CONGLOMERADO, T4.X_UN UN, T12.LAST_NAME GC, T8.LAST_NAME EC, T4.GENERAL_LEDGER ORG_VENDAS, T1.NUM_RC_PERIODS PRAZO_CONTRATO, T1.STATUS_CD STATUS_OPTY, T1.REASON_WON_LOST_CD MOTIVO_PERDA_GANHO, T1.EXPECT_CLS_DT PREV_CONCLUSAO, T1.LAST_UPD ULT_UPDATE, SUM(T19.REVN_AMT) VALOR_TOTAL_CONTRATO FROMS_OPTY T1,S_OPTY_ORG_CMPT T2,S_ORG_EXT T3,S_ORG_EXT T4,S_ORG_EXT T5,S_ACCNT_POSTN T6,S_POSTN T7,S_CONTACT T8,S_REVN T9,S_ACCNT_POSTN T10,S_POSTN T11,S_CONTACT T12WHERE T1.ROW_ID = T2.OPTY_ID AND T2.OU_ID = T3.ROW_IDAND T1.PR_DEPT_OU_ID = T4.ROW_IDAND T4.MASTER_OU_ID = T5.ROW_IDAND T5.ROW_ID = T6.OU_EXT_ID (+)AND T6.POSITION_ID = T7.ROW_ID (+)AND T7.PR_EMP_ID = T8.ROW_ID (+)AND T7.POSTN_TYPE_CD = 'EC' AND T4.MASTER_OU_ID = T10.OU_EXT_ID (+)AND T10.POSITION_ID = T11.ROW_ID (+)AND T11.PR_EMP_ID = T12.ROW_ID (+)AND T11.POSTN_TYPE_CD = 'GC'AND T1.ROW_ID = T13.OPTY_ID GROUP BY T3.NAME, T4.OU_NUM, T4.NAME, T5.OU_NUM, T5.NAME, T4.X_UN , T4.GENERAL_LEDGER, T1.NUM_RC_PERIODS, T12.LAST_NAME, T8.LAST_NAME, T1.ROW_ID , T1.STATUS_CD , T1.LAST_UPD, T1.EXPECT_CLS_DT , T1.REASON_WON_LOST_CDORDER BY OPTYO problema é que apesar de utilizar o (+) nos joins ele só está retornando os registros que existam em T5 e T7. Gostaria que quando ele não encontrasse correspondência trouxesse o campo T8.LAST_NAME vazio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem uma clausula de constante para T7

 

AND T7.POSTN_TYPE_CD = 'EC'

 

 

tente

 

 

AND ((T7.ROW_ID is null) or ( T7.POSTN_TYPE_CD = 'EC'))

 

 

creio de resolve

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sei que o problema está na linha AND T7.POSTN_TYPE_CD = 'EC', mas não sei como fazer de outra forma.

 

T7 é uma tabela que contém os cargos de uma determinada empresa. EC significa 'Engenheiro Comercial' e 'GC' Gerente de Contas. Mas quando a empresa é cadastrada, um cargo default é cadastro em T7.

 

Por isso, T7.ROW_ID nunca vai ser igual a NULL, sendo assim não posso utilizar essa condição.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então não precisa do outer join em T7 , não ?

 

Não pode testar por este cargo default ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

E como eu faria isso?Digamos que a estrutura de T7 seja assim:COD_EMPRESA -- CARGO -- ID_FUNCIONARIO1 -- EC -- 1-56W1 -- GC -- 1-89W1 -- CD -- 1-57W2 -- EC -- 1-45W3 -- DEFAULT -- 1-00WNa minha query tenho que selecionar informações da Empresa, além de selecionar o nome dos funcionários que estejam no cargo EC e GC. Então, gostaria que a query trouxesse os seguintes resultados:COD_EMPRESA -- ID GC -- ID EC1 -- 1-89W -- 1-56W2 -- NULL -- 1-45W3 -- NULL -- NULLMas a query retorna nesse caso apenas uma linha:COD_EMPRESA -- ID GC -- ID EC1 -- 1-89W -- 1-56W

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que ainda nao entendi bem mas um UNION com outra query onde só buscasse os func´s com os cargos default poderia ser a solucao

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu até posso fazer um UNION com um outro select que pegue só o cargo default, mais ainda assim a pesquisa não ficará correta.Usando o mesmo exemplo que dei anteriormente:Ele deveria trazer os seguintes resultados:COD_EMPRESA -- ID GC -- ID EC1 -- 1-89W -- 1-56W2 -- NULL -- 1-45W3 -- NULL -- NULLMas traria apenas esses:COD_EMPRESA -- ID GC -- ID EC1 -- 1-89W -- 1-56W3 -- NULL -- NULLTentei criar uma subquery para consultar o EC e GC, mas não funciona por causa do GROUP BY...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.