Usuário com melhor resposta
Evitar multiplos JOIN na mesma tabela

Pergunta
-
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.
Respostas
-
Deleted
- Marcado como Resposta ifgandrade segunda-feira, 8 de maio de 2017 12:38
Todas as Respostas
-
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.
-
-
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
-
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
-
-
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.
-
-
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.
-
-
Deleted
- Marcado como Resposta ifgandrade segunda-feira, 8 de maio de 2017 12:38
-
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.
- Primeiro verifica no case se existe um idTipoComp = 1 que a DataCompromisso seja uma data futura. Por isso eu coloquei o c.DataCompromisso > GETDATE().
- 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.
- 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
-
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.
-
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.