none
LEFT JOIN COM EXISTS E OR RRS feed

  • Pergunta

  • Boa tarde pessoal!

    Estou com um problema, na minha relação. Mesmo trazendo o LEFT JOIN com EXISTS o resultado está me trazendo com valores nulos, pq estou aplicando OR, preciso de uma solução, pois não posso tirar a condição OR, pois estou fazendo uma ponte, se não haver dados em um movimento para ele pular para o proximo.

    SELECT TRES.CODCOLIGADA,
    CASE WHEN TRES.CODTMV='1.1.03' THEN TRES.IDMOV END IDMOV3,
    CASE WHEN TRES.CODTMV='1.1.03' THEN TRES.NUMEROMOV END NUMEROMOV3,
    CASE WHEN TRES.CODTMV='1.1.03' THEN TRES.CODTMV END CODTMV3,

    CASE WHEN DOZE.CODTMV='1.1.12' THEN DOZE.IDMOV END IDMOV12,
    CASE WHEN DOZE.CODTMV='1.1.12' THEN DOZE.NUMEROMOV END NUMEROMOV12,
    CASE WHEN DOZE.CODTMV='1.1.12' THEN DOZE.CODTMV END CODTMV12, 
    CASE WHEN DOZE.CODTMV='1.1.12' THEN DOZE.STATUS END STATUS12,

    CASE WHEN QUATRO.CODTMV='1.1.04' THEN QUATRO.IDMOV END IDMOV4,
    CASE WHEN QUATRO.CODTMV='1.1.04' THEN QUATRO.NUMEROMOV END NUMEROMOV4,
    CASE WHEN QUATRO.CODTMV='1.1.04' THEN QUATRO.CODTMV END CODTMV4
    FROM 
    TMOV TRES

    LEFT JOIN TMOVRELAC B (NOLOCK) ON B.CODCOLORIGEM = TRES.CODCOLIGADA AND TRES.IDMOV = B.IDMOVORIGEM

    LEFT JOIN TMOV DOZE (NOLOCK) ON DOZE.CODCOLIGADA = B.CODCOLDESTINO AND DOZE.IDMOV = B.IDMOVDESTINO
    LEFT JOIN TMOVRELAC C (NOLOCK) ON C.CODCOLORIGEM = DOZE.CODCOLIGADA AND DOZE.IDMOV = C.IDMOVORIGEM

    LEFT JOIN TMOV QUATRO (NOLOCK) ON  EXISTS (SELECT 1 FROM TMOV WHERE QUATRO.CODCOLIGADA = B.CODCOLDESTINO AND QUATRO.IDMOV = B.IDMOVDESTINO) 
    OR  EXISTS (SELECT 1 FROM TMOV WHERE QUATRO.CODCOLIGADA = C.CODCOLDESTINO AND QUATRO.IDMOV = C.IDMOVDESTINO)
    LEFT JOIN TMOVRELAC D (NOLOCK) ON D.CODCOLORIGEM = QUATRO.CODCOLIGADA AND QUATRO.IDMOV = D.IDMOVORIGEM 
    WHERE
    DOZE.CODCOLIGADA=1 AND 
    DOZE.codtmv = '1.1.12' AND
    DOZE.IDMOV=147678



    CharlesTI.


    • Editado CHARLES.PTU segunda-feira, 13 de novembro de 2017 17:25
    segunda-feira, 13 de novembro de 2017 17:25

Respostas

Todas as Respostas

  • Deleted
    segunda-feira, 13 de novembro de 2017 17:52
  • Boa tarde José Diz.

    vou te explicar encima de um fluxograma

    Esses numeros são apenas apelidos que usei para não me perder na hora do relacionamento. É que cada aprovação que tem aqui ele cria um fluxo de aprovação, só que no meio do processo na epoca mandaram criar um fluxo de aprovação entre o movimento 1.1.03 e o 1.1.04, cada fluxo como vc pode ver tem sua id primaria, e o numeromov se repete em ambas, porém a tabela que uso para relacionar um movimento com outro atraves da ID é a tabela TMOVRELAC. na tabela tem o IDMOVORIGEM E O IDMOVDESTINO.


    CharlesTI.

    segunda-feira, 13 de novembro de 2017 18:19
  • Qual é o objetivo da consulta?

    O objetivo é trazer apenas uma linha de consulta que nem segue o exemplo do fluxograma

    Isto é, o que ela deve retornar?

    Deve retornar apenas a linha de baixo, pois esta  tinha dados no mov 1.1.12 então era pra trazer a linha 2 apenas, e retirar a linha com dados null no mov 1.1.04, porém pode haver casos de que não tenha dados no 1.1.12 porém pode fazer uma ponte do 1.1.03 para o 1.1.04.

    Achie estranha a junção de TMOVRELAC com DOZE, pois B.IDMOVDESTINO pode ser NULL.

    não achei ainda resposta justamente por causa da ponte q falei logo acima da ponte que as vezes pode fazer.

    Na cláusula WHERE não faltou o filtro 
        and TRES.CODTMV = '1.1.03'  ?

    mesmo colocando não implica pois um join está relacionado com o outro.

    Me parece que na junção de DOZE deve ser acrescentada a condição DOZE.codtmv = '1.1.12', retirando essa condição do filtro (cláusula WHERE).

    Me parece que na junção de QUATRO deve ser acrescentada a condição QUATRO.codtmv = '1.1.04'.

    Talvez seja o caso se reescrever a consulta do zero.

    Ja reescrivi diversas vezes e nada. Meu problema está expecifico nessa ponte q as vezes um pedido pode fazer olha só este exemplo.


    CharlesTI.

    segunda-feira, 13 de novembro de 2017 18:34
  • Deleted
    terça-feira, 14 de novembro de 2017 09:00
  • Bom dia José Diz, tentei pegar essa condição que vc fez e implementar no meu, mas sem sucesso. Não trouxe os dados que queria. Testei a consulta que vc me passou e não da certo pra mim pois o numeromov ele pode duplicar para outros pedidos, a unica coisa q difefere é o idmov.

    CharlesTI.

    terça-feira, 14 de novembro de 2017 12:28
  • Deleted
    terça-feira, 14 de novembro de 2017 15:00
  • O objetivo da consulta é trazer todos quadro do fluxograma em uma linha só independentemente se tem dados faltando ou não, porém que eles não se repitam. Mas acho que resolvi pelo menos uma grande parte do problema. Graças ao codigo que vc postou na consulta eu raciocinei melhor e consegui fazer uma coisa aqui q consegui trazer os valores, mas ainda falta coisas a mudar.

    SELECT  TRES.CODCOLIGADA,
    	CASE WHEN TRES.CODTMV='1.1.03' THEN TRES.IDMOV END IDMOV3,
    	CASE WHEN TRES.CODTMV='1.1.03' THEN TRES.NUMEROMOV END NUMEROMOV3,
    	CASE WHEN TRES.CODTMV='1.1.03' THEN TRES.CODTMV END CODTMV3,
    	CASE WHEN TRES.CODTMV='1.1.03' THEN TRES.STATUS END STATUS12,
    
    	CASE WHEN DOZE.CODTMV='1.1.12' THEN DOZE.IDMOV END IDMOV12,
    	CASE WHEN DOZE.CODTMV='1.1.12' THEN DOZE.NUMEROMOV END NUMEROMOV12,
    	CASE WHEN DOZE.CODTMV='1.1.12' THEN DOZE.CODTMV END CODTMV12, 
    	--CASE WHEN DOZE.CODTMV='1.1.12' THEN DOZE.STATUS END STATUS12,
    
    	CASE WHEN QUATRO.CODTMV='1.1.04' THEN QUATRO.IDMOV END IDMOV4,
    	CASE WHEN QUATRO.CODTMV='1.1.04' THEN QUATRO.NUMEROMOV END NUMEROMOV4,
    	CASE WHEN QUATRO.CODTMV='1.1.04' THEN QUATRO.CODTMV END CODTMV4
    FROM 
    	TMOV TRES
    
    	LEFT JOIN TMOVRELAC B (NOLOCK) ON B.CODCOLORIGEM = TRES.CODCOLIGADA AND TRES.IDMOV = B.IDMOVORIGEM
    
    	LEFT JOIN TMOV DOZE (NOLOCK) ON DOZE.CODCOLIGADA = B.CODCOLDESTINO AND DOZE.IDMOV = B.IDMOVDESTINO
    	LEFT JOIN TMOVRELAC C (NOLOCK) ON C.CODCOLORIGEM = DOZE.CODCOLIGADA AND DOZE.IDMOV = C.IDMOVORIGEM
    
    	LEFT JOIN TMOV QUATRO (NOLOCK) ON  --QUATRO.CODCOLIGADA = B.CODCOLDESTINO AND QUATRO.IDMOV = B.IDMOVDESTINO OR (QUATRO.CODCOLIGADA = C.CODCOLDESTINO AND QUATRO.IDMOV = C.IDMOVDESTINO)
    	
    	--EXISTS (SELECT 1 FROM TMOV WHERE QUATRO.CODCOLIGADA = B.CODCOLDESTINO AND QUATRO.IDMOV = B.IDMOVDESTINO) 
    	EXISTS (SELECT 1 FROM TMOV WHERE --QUATRO.CODCOLIGADA = C.CODCOLDESTINO AND 
    	QUATRO.IDMOV = C.IDMOVDESTINO and (DOZE.codtmv IS NULL or DOZE.CODTMV = '1.1.12') or 
    	(QUATRO.CODCOLIGADA = B.CODCOLDESTINO AND QUATRO.IDMOV = B.IDMOVDESTINO and (QUATRO.codtmv IS NULL or QUATRO.CODTMV = '1.1.04')))
    	
    	--AND NOT EXISTS (SELECT 1 FROM TMOV WHERE QUATRO.CODCOLIGADA = B.CODCOLDESTINO AND QUATRO.IDMOV = B.IDMOVDESTINO AND QUATRO.IDMOV ISNULL)
    	LEFT JOIN TMOVRELAC D (NOLOCK) ON D.CODCOLORIGEM = QUATRO.CODCOLIGADA AND QUATRO.IDMOV = D.IDMOVORIGEM 
    WHERE
    tres.CODCOLIGADA=1 AND 
    DOZE.codtmv = '1.1.12' --AND
    --tres.IDMOV = 143715 


    CharlesTI.

    terça-feira, 14 de novembro de 2017 15:12
  • Deleted
    terça-feira, 14 de novembro de 2017 16:44
  • Nos dois fluxogramas que postou, o conteúdo da coluna NUMEROMOV foi alterado ao passar do movimento '1.1.06' para '1.1.07'; é sempre assim?

    o NUMEROMOV do movmento 1.1.06 par ao 1.1.07 muda pois esse numero aqui do mov 1.1.03 até o 1.1.06 ele é chamado de numero do pedido que é impresso no relatório( Solicitação de compras), quando todos aprovam ai vai para o processo de cotação e la gera um outro NUMEROMOV que se repete do 1.1.07 até o 1.1.10 e se chama numero da Autorização de fornecimento (ORDEM DE COMPRAS).

    Como saber quando é o início de um fluxo de aprovação e qual é o último movimento de um fluxo de aprovação?

    o inicio do fluxo de aprovação de solicitação de compras começa no 1.1.03 e morre no 1.1.06.

    o inicio do fluxo de aprovação de Autorização de Fornecimento começa no 1.1.07 e morre no 1.1.10.

    A unica coisa q liga o mov 1.1.06 ao 1.1.07 é justamente o IDMOV

    Há um número máximo de movimentos para cada fluxo de aprovação?

    é uma base de 8 caracteres

    Você pode postar neste tópico código SQL contendo amostra dos dados?

    Vou postar sim, logo abaixo.

    1 136661 002410 1.1.03 08/02/2017 NULL NULL NULL NULL 136673 002410 1.1.04 08/02/2017 136690 002410 1.1.05 10/02/2017 136920 002410 1.1.06 24/02/2017 137314 000068 1.1.07 11/03/2017 NULL NULL NULL NULL 137472 000068 1.1.08 14/03/2017 137473 000068 1.1.09 14/03/2017 137474 000068 1.1.10 14/03/2017 137913 000010657 Notas Fiscais de Compras


    CharlesTI.

    terça-feira, 14 de novembro de 2017 16:57
  • Deleted
    terça-feira, 14 de novembro de 2017 17:07
  • -- código #3
    SELECT *
      from TMOVRELAC
      where IDMOVORIGEM in (143351, 143544);


    CharlesTI.

    terça-feira, 14 de novembro de 2017 18:36
  • Deleted
    sábado, 18 de novembro de 2017 09:55
  • Bom dia,

    Por falta de retorno essa thread está encerrada.

    Se necessário, favor abrir uma nova thread.

    Atenciosamente,


    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 20 de novembro de 2017 13:20
    Moderador