none
Evitar multiplos JOIN na mesma tabela RRS feed

  • Pergunta

  • Galera, boa noite!

    Aceito dicas e sugestões para o seguinte problema.

    Tenho duas tabelas relacionadas onde um ID da tabela A tem múltiplos valores em uma tabela B.

    Quero juntar na mesma linha todos os valores da tabela B para um ID correspondente da tabela A.

    Para isso estou tendo que fazer muitos LEFT JOIN para a tabela B, e acredito que possa existir uma maneira melhor ao invés de escrever múltiplos JOIN para a mesma tabela.

    Alguém já sabe uma maneira diferente para resolver isso. Estava pesquisando sobre CTE, mas ainda não sei se pode resolver esse problema.

    Desde já agradeço.

    terça-feira, 2 de maio de 2017 04:00

Respostas

Todas as Respostas

  • ifgandrade,

    Qual o código atual? E se possível acrescente uma imagem do plano de execução.


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    terça-feira, 2 de maio de 2017 10:19
  • Deleted
    terça-feira, 2 de maio de 2017 10:26
  • Juliano, bom dia

    Depois posso mandar o plano de execução. O código atual é esse abaixo:

    #####

    SELECT 
    CF_Orgao.Texto AS [Órgão],
    CF_DEPT.Texto AS [Departamento],
    CF_MotivoB.Texto AS [Motivo da Baixa],
    CF_IDShare.Texto AS [ID Share / Nº Sistema Cliente],
    CF_Resp.Texto AS [Responsabilidade],
    CF_CausaR.Texto AS [Causa Real],
    CF_Multa.Texto AS [Multa],
    CF_TMulta.Texto AS [Tipo de multa],
    CF_LMulta.Texto AS [Limite de multa],
    CF_PCliente.Texto AS [Pasta Cliente],
    CF_Terceiros.Texto AS [Terceiros],
    CF_Garantia.Texto AS [Garantia],
    CF_CTCCliente.Texto AS [Centro de Custo Cliente],
    CF_Liminar.Texto AS [Liminar],
    CF_TProcesso.Texto AS [Tipo de Processo],
    CF_Funcao.Texto AS [Função],
    CF_Revisao.Texto AS [Revisão],
    CF_DptoResPg.Texto AS [Dpto Responsável Pgto],
    CF_DptoSonyI.Texto AS [Dpto Sony Interno],
    CF_DtRecCtCli.Data AS [DT Rec. Citação Cliente],
    CF_DtRecPro.Data AS [DT Rec.Processo],
    CF_DtRecRc.Data AS [DT Protocolo do Recurso],
    CF_DtRevisao.Data AS [Data Revisão]
    FROM 
    Processos F (NOLOCK)
    LEFT JOIN 
    CustomFieldValue CF_Admissao (NOLOCK) ON CF_Admissao.IdContexto = F.idPasta AND CF_Admissao.IdCustomField = 14 --DT_ADMISSAO
    LEFT JOIN
    CustomFieldValue CF_Orgao (NOLOCK) ON CF_Orgao.IdContexto = F.idPasta AND CF_Orgao.IdCustomField = 1 --Orgao
    LEFT JOIN
    CustomFieldValue CF_DEPT (NOLOCK) ON CF_DEPT.IdContexto = F.idPasta AND CF_DEPT.IdCustomField = 2 --Departamento
    LEFT JOIN
    CustomFieldValue CF_MotivoB (NOLOCK) ON CF_MotivoB.IdContexto = F.idPasta AND CF_MotivoB.IdCustomField = 3 --Motivo da Baixa
    LEFT JOIN
    CustomFieldValue CF_IDShare (NOLOCK) ON CF_IDShare.IdContexto = F.idPasta AND CF_IDShare.IdCustomField = 4 --ID Share / Nº Sistema Cliente
    LEFT JOIN
    CustomFieldValue CF_Resp (NOLOCK) ON CF_Resp.IdContexto = F.idPasta AND CF_Resp.IdCustomField = 5 --Responsabilidade
    LEFT JOIN
    CustomFieldValue CF_CausaR (NOLOCK) ON CF_CausaR.IdContexto = F.idPasta AND CF_CausaR.IdCustomField = 6 --Causa Real
    LEFT JOIN
    CustomFieldValue CF_Multa (NOLOCK) ON CF_Multa.IdContexto = F.idPasta AND CF_Multa.IdCustomField = 7 --Multa
    LEFT JOIN
    CustomFieldValue CF_TMulta (NOLOCK) ON CF_TMulta.IdContexto = F.idPasta AND CF_TMulta.IdCustomField = 8 --Tipo Multa
    LEFT JOIN
    CustomFieldValue CF_LMulta (NOLOCK) ON CF_LMulta.IdContexto = F.idPasta AND CF_LMulta.IdCustomField = 9 --Limite Multa
    LEFT JOIN
    CustomFieldValue CF_PCliente (NOLOCK) ON CF_PCliente.IdContexto = F.idPasta AND CF_PCliente.IdCustomField = 10 --Pasta Cliente
    LEFT JOIN
    CustomFieldValue CF_Terceiros (NOLOCK) ON CF_Terceiros.IdContexto = F.idPasta AND CF_Terceiros.IdCustomField = 106 --Terceiros
    LEFT JOIN
    CustomFieldValue CF_Garantia (NOLOCK) ON CF_Garantia.IdContexto = F.idPasta AND CF_Garantia.IdCustomField = 107 --Garantia
    LEFT JOIN
    CustomFieldValue CF_CTCCliente (NOLOCK) ON CF_CTCCliente.IdContexto = F.idPasta AND CF_CTCCliente.IdCustomField = 108 --Centro de Custo Cliente
    LEFT JOIN
    CustomFieldValue CF_Liminar (NOLOCK) ON CF_Liminar.IdContexto = F.idPasta AND CF_Liminar.IdCustomField = 109 --Liminar
    LEFT JOIN
    CustomFieldValue CF_TProcesso (NOLOCK) ON CF_TProcesso.IdContexto = F.idPasta AND CF_TProcesso.IdCustomField = 110 --Tipo de Processo
    LEFT JOIN
    CustomFieldValue CF_CPComplexo (NOLOCK) ON CF_CPComplexo.IdContexto = F.idPasta AND CF_CPComplexo.IdCustomField = 111 --Processo Complexo
    LEFT JOIN
    CustomFieldValue CF_Funcao (NOLOCK) ON CF_Funcao.IdContexto = F.idPasta AND CF_Funcao.IdCustomField = 112 --Função
    LEFT JOIN
    CustomFieldValue CF_Revisao (NOLOCK) ON CF_Revisao.IdContexto = F.idPasta AND CF_Revisao.IdCustomField = 113 --Revisão
    LEFT JOIN
    CustomFieldValue CF_DptoResPg (NOLOCK) ON CF_DptoResPg.IdContexto = F.idPasta AND CF_DptoResPg.IdCustomField = 114 --Dpto Responsável Pgto
    LEFT JOIN
    CustomFieldValue CF_DptoSonyI (NOLOCK) ON CF_DptoSonyI.IdContexto = F.idPasta AND CF_DptoSonyI.IdCustomField = 115 --Dpto Sony Interno
    LEFT JOIN
    CustomFieldValue CF_DtRecCtCli (NOLOCK) ON CF_DtRecCtCli.IdContexto = F.idPasta AND CF_DtRecCtCli.IdCustomField = 11 --Data Rec Cit Cliente
    LEFT JOIN
    CustomFieldValue CF_DtRecPro (NOLOCK) ON CF_DtRecPro.IdContexto = F.idPasta AND CF_DtRecPro.IdCustomField = 12 --Data Rec Processo
    LEFT JOIN
    CustomFieldValue CF_DtRecRc (NOLOCK) ON CF_DtRecRc.IdContexto = F.idPasta AND CF_DtRecRc.IdCustomField = 13 --Data do Protocolo do Recurso
    LEFT JOIN
    CustomFieldValue CF_DtRevisao (NOLOCK) ON CF_DtRevisao.IdContexto = F.idPasta AND CF_DtRevisao.IdCustomField = 116 --Data Revisao
    LEFT JOIN 
    CustomFieldValue CF_Demissao (NOLOCK) ON CF_Demissao.IdContexto = F.idPasta AND CF_Demissao.IdCustomField = 15 --DT_DEMISSAO
    LEFT JOIN 
    CustomFieldValue CF_USalario (NOLOCK) ON CF_USalario.IdContexto = F.idPasta AND CF_USalario.IdCustomField = 16 --Ult_Salario
    LEFT JOIN 
    Cidade C (NOLOCK) ON C.idCidade = F.idCidade
    LEFT JOIN 
    UF (NOLOCK) ON UF.idUF = C.idUFCidade

    LEFT JOIN 
    Compromisso CompMomento (nolock) ON CompMomento.idCompromisso = 
    (
    SELECT 
    TOP 1 C.idCompromisso 
    FROM 
    Compromisso c (nolock)
    INNER JOIN 
    CompContexto CC (NOLOCK) ON C.idCompromisso = CC.IdCompromisso
    WHERE 
    CC.IdContexto = F.idPasta AND IdTipoComp = 2 ORDER BY idCompromisso DESC
    )
    LEFT JOIN 

    Compromisso CompAudiencia (NOLOCK) ON CompAudiencia.idCompromisso =

    (
    SELECT  
    CASE WHEN EXISTS
    (
    SELECT  
    c.idCompromisso
    FROM 
    Compromisso C (NOLOCK)
    INNER JOIN 
    CompContexto CC (NOLOCK) ON CC.IdCompromisso = C.idCompromisso
    WHERE
    CC.IdContexto = F.idPasta AND IdTipoComp = 1 AND c.DataCompromisso > GETDATE())
    THEN (
    SELECT  
    TOP 1 c.idCompromisso
    FROM 
    Compromisso C (NOLOCK)
    INNER JOIN 
    CompContexto CC (NOLOCK) ON CC.IdCompromisso = C.idCompromisso
    WHERE
    CC.IdContexto = F.idPasta AND IdTipoComp = 1 AND c.DataCompromisso > GETDATE()
    ORDER BY C.DataCompromisso ASC
    )

    ELSE 
    (
    SELECT  
    TOP 1 C.idCompromisso
    FROM 
    Compromisso C (NOLOCK)
    INNER JOIN 
    CompContexto CC (NOLOCK) ON CC.IdCompromisso = C.idCompromisso
    WHERE
    CC.IdContexto = F.idPasta AND IdTipoComp = 1 ORDER BY C.DataCompromisso DESC
    )
    END AS IDCOMPROMISSO
    FROM 
    Compromisso C (NOLOCK)
    INNER JOIN 
    CompContexto CC (NOLOCK) ON CC.IdCompromisso = C.idCompromisso
    WHERE
    CC.IdContexto = F.idPasta AND IdTipoComp = 1 AND c.DataCompromisso > GETDATE()
    )

    LEFT JOIN
    GEN_SubTipoTarefa SubTpAudiencia (NOLOCK) ON SubTpAudiencia.idSubTipoTarefa = CompAudiencia.IdSubTipoComp
    WHERE  F.idPasta = 125118 

    ####

    Desde já agradeço a atenção.

    Att.

    Igor

    terça-feira, 2 de maio de 2017 13:59
  • José, bom dia!

    Da tabela B eu pegaria somente quandos os ID forem 1,2,3,4,5,6,7,8,9,10,11,12,14,106,107,108,109,110,111,112,113,114,115,116 para cada ID da tabela A.

    Eu coloquei acima como esta hoje a estrutura do meu SELECT.

    Obrigado pela ajuda.

    Att.

    Igor

    terça-feira, 2 de maio de 2017 14:26
  • Deleted
    terça-feira, 2 de maio de 2017 14:27
  • José, boa tarde!!

    Passando utilizar esse modelo  [nome da coluna]= max(case when CFV.IdCustomField = valor then CFV.Texto ou Data end), é um custo alto em performance da consulta? Eu ainda não conhecia essa forma para resolver esse problema com vários JOIN para mesma tabela.

    A minha consulta é para trazer todos os valores personalizados na mesma linha para cada processo.

    Obrigado pela ajuda.

    terça-feira, 2 de maio de 2017 17:14
  • Deleted
    terça-feira, 2 de maio de 2017 17:44
  • José, boa noite!

    Abaixo segue minha consulta completa até o momento. Estou pensando em uma maneira de diminuir a complexidade que ficou essa consulta em partes menores. Arrumar uma maneira de quebrar esse SELECT em partes menores para facilitar a manutenção. Para deixar voce mais por dentro do assunto, eu estou fazendo essa consulta para gerar uma view que será utilizada em uma planilha excel como dashboard.

    Segue a consulta até o momento:

    ####

    SELECT 
    F.Codigo AS [CP-PRO],
    F.ProtocoloInicial AS [CNJ],
    F.NomeTipoAcao AS [Acao],
    F.NomeNat AS [Natureza],
    F.Cliente,
    F.NomePosicao AS [Posição cliente],
    F.GEN_Area_Atual AS [Escritório Responsável],
    F.GEN_Area_Origem AS [Escritório Origem],
    F.Contrario,
    CF_Admissao.Data AS [Admissão],
    CF_Demissao.Data AS [Demissão],
    CF_USalario.Moeda AS [Último Salário],
    F.AdvogadoAdverso AS [Advogado Adverso],
    CONCAT(CONCAT(NumJurisdicao, Sufixo), NomeJurisdicaoAtual) AS [Vara],
    F.NomeCidade AS Cidade,
    UF.NomeUF AS UF,
    F.TituloPasta AS Titulo,
    F.PastaStatus AS Status,
    F.NomeFase AS Fase,
    CompAudiencia.DataCompromisso AS [Dt Comp. Audiencia],
    SubTpAudiencia.NomeSubTipoTarefa AS [SubTipo Audiencia],
    CompMomento.DataCadastro AS [Data Cadastro Momento Processual],
    CF_Orgao.Texto AS [Órgão],
    CF_DEPT.Texto AS [Departamento],
    CF_MotivoB.Texto AS [Motivo da Baixa],
    CF_IDShare.Texto AS [ID Share / Nº Sistema Cliente],
    CF_Resp.Texto AS [Responsabilidade],
    CF_CausaR.Texto AS [Causa Real],
    CF_Multa.Texto AS [Multa],
    CF_TMulta.Texto AS [Tipo de multa],
    CF_LMulta.Texto AS [Limite de multa],
    CF_PCliente.Texto AS [Pasta Cliente],
    CF_Terceiros.Texto AS [Terceiros],
    CF_Garantia.Texto AS [Garantia],
    CF_CTCCliente.Texto AS [Centro de Custo Cliente],
    CF_Liminar.Texto AS [Liminar],
    CF_TProcesso.Texto AS [Tipo de Processo],
    CF_Funcao.Texto AS [Função],
    CF_Revisao.Texto AS [Revisão],
    CF_DptoResPg.Texto AS [Dpto Responsável Pgto],
    CF_DptoSonyI.Texto AS [Dpto Sony Interno],
    CF_DtRecCtCli.Data AS [DT Rec. Citação Cliente],
    CF_DtRecPro.Data AS [DT Rec.Processo],
    CF_DtRecRc.Data AS [DT Protocolo do Recurso],
    CF_DtRevisao.Data AS [Data Revisão]

    FROM 
    FullProcesso F (NOLOCK)
    LEFT JOIN 
    CustomFieldValue CF_Admissao (NOLOCK) ON CF_Admissao.IdContexto = F.idPasta AND CF_Admissao.IdCustomField = 14 --DT_ADMISSAO
    LEFT JOIN
    CustomFieldValue CF_Orgao (NOLOCK) ON CF_Orgao.IdContexto = F.idPasta AND CF_Orgao.IdCustomField = 1 --Orgao
    LEFT JOIN
    CustomFieldValue CF_DEPT (NOLOCK) ON CF_DEPT.IdContexto = F.idPasta AND CF_DEPT.IdCustomField = 2 --Departamento
    LEFT JOIN
    CustomFieldValue CF_MotivoB (NOLOCK) ON CF_MotivoB.IdContexto = F.idPasta AND CF_MotivoB.IdCustomField = 3 --Motivo da Baixa
    LEFT JOIN
    CustomFieldValue CF_IDShare (NOLOCK) ON CF_IDShare.IdContexto = F.idPasta AND CF_IDShare.IdCustomField = 4 --ID Share / Nº Sistema Cliente
    LEFT JOIN
    CustomFieldValue CF_Resp (NOLOCK) ON CF_Resp.IdContexto = F.idPasta AND CF_Resp.IdCustomField = 5 --Responsabilidade
    LEFT JOIN
    CustomFieldValue CF_CausaR (NOLOCK) ON CF_CausaR.IdContexto = F.idPasta AND CF_CausaR.IdCustomField = 6 --Causa Real
    LEFT JOIN
    CustomFieldValue CF_Multa (NOLOCK) ON CF_Multa.IdContexto = F.idPasta AND CF_Multa.IdCustomField = 7 --Multa
    LEFT JOIN
    CustomFieldValue CF_TMulta (NOLOCK) ON CF_TMulta.IdContexto = F.idPasta AND CF_TMulta.IdCustomField = 8 --Tipo Multa
    LEFT JOIN
    CustomFieldValue CF_LMulta (NOLOCK) ON CF_LMulta.IdContexto = F.idPasta AND CF_LMulta.IdCustomField = 9 --Limite Multa
    LEFT JOIN
    CustomFieldValue CF_PCliente (NOLOCK) ON CF_PCliente.IdContexto = F.idPasta AND CF_PCliente.IdCustomField = 10 --Pasta Cliente
    LEFT JOIN
    CustomFieldValue CF_Terceiros (NOLOCK) ON CF_Terceiros.IdContexto = F.idPasta AND CF_Terceiros.IdCustomField = 106 --Terceiros
    LEFT JOIN
    CustomFieldValue CF_Garantia (NOLOCK) ON CF_Garantia.IdContexto = F.idPasta AND CF_Garantia.IdCustomField = 107 --Garantia
    LEFT JOIN
    CustomFieldValue CF_CTCCliente (NOLOCK) ON CF_CTCCliente.IdContexto = F.idPasta AND CF_CTCCliente.IdCustomField = 108 --Centro de Custo Cliente
    LEFT JOIN
    CustomFieldValue CF_Liminar (NOLOCK) ON CF_Liminar.IdContexto = F.idPasta AND CF_Liminar.IdCustomField = 109 --Liminar
    LEFT JOIN
    CustomFieldValue CF_TProcesso (NOLOCK) ON CF_TProcesso.IdContexto = F.idPasta AND CF_TProcesso.IdCustomField = 110 --Tipo de Processo
    LEFT JOIN
    CustomFieldValue CF_CPComplexo (NOLOCK) ON CF_CPComplexo.IdContexto = F.idPasta AND CF_CPComplexo.IdCustomField = 111 --Processo Complexo
    LEFT JOIN
    CustomFieldValue CF_Funcao (NOLOCK) ON CF_Funcao.IdContexto = F.idPasta AND CF_Funcao.IdCustomField = 112 --Função
    LEFT JOIN
    CustomFieldValue CF_Revisao (NOLOCK) ON CF_Revisao.IdContexto = F.idPasta AND CF_Revisao.IdCustomField = 113 --Revisão
    LEFT JOIN
    CustomFieldValue CF_DptoResPg (NOLOCK) ON CF_DptoResPg.IdContexto = F.idPasta AND CF_DptoResPg.IdCustomField = 114 --Dpto Responsável Pgto
    LEFT JOIN
    CustomFieldValue CF_DptoSonyI (NOLOCK) ON CF_DptoSonyI.IdContexto = F.idPasta AND CF_DptoSonyI.IdCustomField = 115 --Dpto Sony Interno
    LEFT JOIN
    CustomFieldValue CF_DtRecCtCli (NOLOCK) ON CF_DtRecCtCli.IdContexto = F.idPasta AND CF_DtRecCtCli.IdCustomField = 11 --Data Rec Cit Cliente
    LEFT JOIN
    CustomFieldValue CF_DtRecPro (NOLOCK) ON CF_DtRecPro.IdContexto = F.idPasta AND CF_DtRecPro.IdCustomField = 12 --Data Rec Processo
    LEFT JOIN
    CustomFieldValue CF_DtRecRc (NOLOCK) ON CF_DtRecRc.IdContexto = F.idPasta AND CF_DtRecRc.IdCustomField = 13 --Data do Protocolo do Recurso
    LEFT JOIN
    CustomFieldValue CF_DtRevisao (NOLOCK) ON CF_DtRevisao.IdContexto = F.idPasta AND CF_DtRevisao.IdCustomField = 116 --Data Revisao
    LEFT JOIN 
    CustomFieldValue CF_Demissao (NOLOCK) ON CF_Demissao.IdContexto = F.idPasta AND CF_Demissao.IdCustomField = 15 --DT_DEMISSAO
    LEFT JOIN 
    CustomFieldValue CF_USalario (NOLOCK) ON CF_USalario.IdContexto = F.idPasta AND CF_USalario.IdCustomField = 16 --Ult_Salario
    LEFT JOIN 
    Cidade C (NOLOCK) ON C.idCidade = F.idCidade
    LEFT JOIN 
    UF (NOLOCK) ON UF.idUF = C.idUFCidade

    LEFT JOIN 
    Compromisso CompMomento (nolock) ON CompMomento.idCompromisso = 
    (
    SELECT 
    TOP 1 C.idCompromisso 
    FROM 
    Compromisso c (nolock)
    INNER JOIN 
    CompContexto CC (NOLOCK) ON C.idCompromisso = CC.IdCompromisso
    WHERE 
    CC.IdContexto = F.idPasta AND IdTipoComp = 2 ORDER BY idCompromisso DESC
    )
    LEFT JOIN 

    Compromisso CompAudiencia (NOLOCK) ON CompAudiencia.idCompromisso =

    (
    SELECT  
    CASE WHEN EXISTS
    (
    SELECT  
    c.idCompromisso
    FROM 
    Compromisso C (NOLOCK)
    INNER JOIN 
    CompContexto CC (NOLOCK) ON CC.IdCompromisso = C.idCompromisso
    WHERE
    CC.IdContexto = F.idPasta AND IdTipoComp = 1 AND c.DataCompromisso > GETDATE())
    THEN (
    SELECT  
    TOP 1 c.idCompromisso
    FROM 
    Compromisso C (NOLOCK)
    INNER JOIN 
    CompContexto CC (NOLOCK) ON CC.IdCompromisso = C.idCompromisso
    WHERE
    CC.IdContexto = F.idPasta AND IdTipoComp = 1 AND c.DataCompromisso > GETDATE()
    ORDER BY C.DataCompromisso ASC
    )

    ELSE 
    (
    SELECT  
    TOP 1 C.idCompromisso
    FROM 
    Compromisso C (NOLOCK)
    INNER JOIN 
    CompContexto CC (NOLOCK) ON CC.IdCompromisso = C.idCompromisso
    WHERE
    CC.IdContexto = F.idPasta AND IdTipoComp = 1 ORDER BY C.DataCompromisso DESC
    )
    END AS IDCOMPROMISSO
    FROM 
    Compromisso C (NOLOCK)
    INNER JOIN 
    CompContexto CC (NOLOCK) ON CC.IdCompromisso = C.idCompromisso
    WHERE
    CC.IdContexto = F.idPasta AND IdTipoComp = 1 AND c.DataCompromisso > GETDATE()
    )

    LEFT JOIN
    GEN_SubTipoTarefa SubTpAudiencia (NOLOCK) ON SubTpAudiencia.idSubTipoTarefa = CompAudiencia.IdSubTipoComp


    WHERE  F.idPasta = 125118 

    #######

    Eu comecei a procurar uma maneira de simplificar essa consulta porque estou tendo problemas com o penúltimo JOIN.


    quarta-feira, 3 de maio de 2017 01:51
  • José,

    Fazendo da forma do código #2 v5, eu vou precisar colocar todos os demais campos também dentro da clausula group by?

    Att.

    Igor

    quarta-feira, 3 de maio de 2017 02:33
  • Deleted
    • Marcado como Resposta ifgandrade segunda-feira, 8 de maio de 2017 12:38
    quarta-feira, 3 de maio de 2017 09:49
  • José, boa noite

    Vou explicar sobre os relacionamentos dessas tabelas para responder as perguntas.

    A tabela FullProcesso é a tabela principal e nela tem dois ID’s, o IdFullProcesso que é a primary e o idpasta que é utilizado para fazer os relacionamentos com as demais tabelas.

    A tabela Compromisso é uma tabela como o nome já diz para cadastros dos compromissos de cada processo da tabela Fullprocesso. Eu preciso pegar dois tipos de compromisso que são os do campo IdTipoComp que são o 1 e 250. Podem existir mais de um compromisso e podem ser do mesmo tipo. O id primary dessa tabela é o IdCompromisso.

    A tabela CompContexto é uma tabela intermediaria entre a Fullprocesso e a Compromisso. Nessa tabela eu tenho os Campos IdCompromisso é o IdContexto que corresponde ao idPasta da Fullprocesso.

    A tabela GEN_SubTipoTarefa é uma tabela onde ficam os nomes do Subtipo do compromisso. Todo o compromisso tem o tipo do compromisso que no caso eu quero o 1 e o 250 e para cada um deles um subtipo.

    Vou explicar agora o que eu pretendia fazer com os LEFT JOIN de compromisso.
    Para esse primeiro LEFT JOIN abaixo eu quero trazer as informações do idTipoComp 250 mais recente. 


    LEFT JOIN 
       Compromisso CompMomento (nolock) ON CompMomento.idCompromisso = 
    (
     SELECT 
       TOP 1 C.idCompromisso 
     FROM 
       Compromisso c (nolock)
    
    INNER JOIN 
      CompContexto CC (NOLOCK) ON C.idCompromisso = CC.IdCompromisso
    
    WHERE 
       CC.IdContexto = F.idPasta AND IdTipoComp = 2 
    ORDER BY 
       idCompromisso DESC
    )

    Para o segundo LEFT JOIN do compromisso tem uma regra para trazer o valor.

    1. Primeiro verifica no case se existe um idTipoComp = 1 que a DataCompromisso seja uma data futura. Por isso eu coloquei o c.DataCompromisso > GETDATE().
    2. Caso a afirmação acima esteja correta eu preciso trazer o primeiro compromisso de data futura. Logo se eu tenho um compromisso para o dia 04/05 e outro para o dia 10/05 eu devo trazer as informações do 04/05.
    3. Caso não exista uma data futura eu preciso trazer o ultimo idTipoComp = 1 cadastrado para esse processo ou NULL caso não exista mesmo.

    O LEFT JOIN abaixo não deu muito certo porque existem casos como informei que podem trazer mais de idtipocomp = 1.

    LEFT JOIN 
    
    Compromisso CompAudiencia (NOLOCK) ON CompAudiencia.idCompromisso =
    
    (
    SELECT  
      CASE WHEN EXISTS
      (
        SELECT  
          c.idCompromisso
        FROM 
          Compromisso C (NOLOCK)
        INNER JOIN 
          CompContexto CC (NOLOCK) ON CC.IdCompromisso = C.idCompromisso
        WHERE
          CC.IdContexto = F.idPasta AND IdTipoComp = 1 AND c.DataCompromisso > GETDATE())	
       
       THEN (			
           SELECT  
             TOP 1 c.idCompromisso
           FROM 
             Compromisso C (NOLOCK)
           INNER JOIN 
             CompContexto CC (NOLOCK) ON CC.IdCompromisso = C.idCompromisso
          WHERE
           CC.IdContexto = F.idPasta AND IdTipoComp = 1 
           AND c.DataCompromisso > GETDATE()
           ORDER BY C.DataCompromisso ASC
        )
    	
        ELSE 
       (
         SELECT  
           TOP 1 C.idCompromisso
         FROM 
           Compromisso C (NOLOCK)
         INNER JOIN 
           CompContexto CC (NOLOCK) ON CC.IdCompromisso = C.idCompromisso
        WHERE
          CC.IdContexto = F.idPasta AND IdTipoComp = 1 ORDER BY C.DataCompromisso DESC
       )
      END AS IDCOMPROMISSO
      FROM 
        Compromisso C (NOLOCK)
      INNER JOIN 
        CompContexto CC (NOLOCK) ON CC.IdCompromisso = C.idCompromisso
        WHERE
         CC.IdContexto = F.idPasta AND IdTipoComp = 1 AND c.DataCompromisso > GETDATE()
    	)

    O último left join com gen_subtipoTarefa é só para trazer o nome correspondente do subtipo.

    Att.

    Igor

    ifgandrade@gmail.com


    quinta-feira, 4 de maio de 2017 02:17
  • Boa tarde ifgandrade

    Percebi que você marcou uma resposta, poderia por gentileza nos informar se obteve alguma solução?

    Atenciosamente,


    Guilherme Macedo S

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

    TechNet 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.

    quarta-feira, 10 de maio de 2017 18:24
  • Bom dia,

    Por falta de retorno esta thread esta encerrada !

    Por gentileza, caso necessário abra uma nova thread.

    Atenciosamente,


    Guilherme Macedo S

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

    TechNet 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, 15 de maio de 2017 12:18