Usuário com melhor resposta
Realizar uma consulta a partir de dados de outra

Pergunta
-
Boa tarde.
estou fazendo uma query, e estou com uma dúvida de como eu posso fazer a seguinte consulta:
Eu tenho uma consulta, que me retorna as compras de um determinado estabelecimento.
A partir dessa consulta, eu preciso que, para CADA item desse retorno que me gera, eu faça uma busca em outra tabela, que chama FERIADO, e verifico se essa compra foi em um feriado, caso foi, eu quero gerar uma nova tabela com esses dados.
Como eu consigo fazer isso?
Obrigado desde já.
______________________________________________________________ Ari Thomazini. Graduado em Ciência da Computação. ITIL V3 Certified. Scrum Master Certified.
Respostas
-
Boa Noite,
O operador CROSS APPLY (ou o OUTER APPLY) poderá ajudá-lo muito nessa tarefa.
[ ]s,
Gustavo Maia Aguiar
Blog: http://gustavomaiaaguiar.wordpress.com
Vídeos:http://www.youtube.com/user/gmasqlClassifique as respostas. O seu feedback é imprescindível
- Marcado como Resposta Harley Araujo quarta-feira, 12 de setembro de 2012 20:23
-
Não vou entrar na questão da performance das consultas.
Uma opção que você tem é jogar o resultado da sua primeira consulta para uma tabela temporária e utilizar esta tabela para a segunda consulta.
Roberson Ferreira - Database Developer
Acesse: www.robersonferreira.com.br
Email: contato@robersonferreira.com.brSe esta sugestão for útil, por favor, classifique-a como útil.
Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.- Marcado como Resposta Harley Araujo quarta-feira, 12 de setembro de 2012 20:23
Todas as Respostas
-
Há diversas formas. Para que possamos aconselhar a mais viável, favor postar a estrutura de sua tabela (campos) e alguns exemplos, além de informar a versão do seu SQL.
Roberson Ferreira - Database Developer
Acesse: www.robersonferreira.com.br
Email: contato@robersonferreira.com.brSe esta sugestão for útil, por favor, classifique-a como útil.
Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta. -
Roberson, eu usei um exemplo para mostrar o problema que eu estou enfrentando, pq como é dados de uma empresa, para a qual eu trabalho, eu acho que não posso compartilhá-los aqui.
a versão do sql que uso é a 2008.
Eu andei dando uma pesquisada e vi que tem gente aconselhando a usar WITH, porém nunca ouvi falar.
Ari Thomazini. Graduado em Ciência da Computação. ITIL V3 Certified Scrum Master Certified MCPD
-
Por "With" você deve estar se referindo a um conceito chamado CTE (Common Table Expression). Sim, talvez seja um recurso a ser empregado na solução.
Em relação aos exemplos, você não precisa postar os dados reais. Somente exemplos fictícios para termos certeza que estaremos oferecendo uma solução adequada.
E a estrutura da tabela (metadados) não há problema em ser compartilhada. (Também não precisa ser a estrutura completa. Somente os campos que envolvem a sua questão.)
Roberson Ferreira - Database Developer
Acesse: www.robersonferreira.com.br
Email: contato@robersonferreira.com.brSe esta sugestão for útil, por favor, classifique-a como útil.
Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta. -
Roberson, essa é a consulta que eu já fiz:
select a.status_avaliacao_id, sa.descricao_Status, a.tipo_avaliacao_id, a.unidade_escolar_id, ta.tipo, c.id contrato_id, case when not a.Semana is null then a.Semana else ub.semana end Semana, case when not a.mes_referencia is null then convert(varchar(10),a.mes_referencia,103) else convert(varchar(10),ub.mes_ano,103) end mes_referencia, ue.regional_codigo, ue.unidade_codigo, res.responsavel_matricula, emp.CNPJ, c.numero, c.tipo_servico_id from contrato c left join avaliacao a on a.contrato_id = c.id inner join v_unidade_escolar ue on a.unidade_escolar_id = ue.unidade_codigo inner join v_responsavel_unidade res on res.unidade_codigo = ue.unidade_codigo inner join empresa emp on emp.id = c.empresa_id left join unidade_Bloqueio ub on ue.unidade_codigo = ub.unidade_codigo and c.tipo_servico_id = ub.tipo_servico_id and ub.data_desbloqueio is null left join tipo_Avaliacao ta on ta.id = a.tipo_avaliacao_id left join tipo_Servico ts on ts.id = c.tipo_servico_id left join status_Avaliacao sa on sa.id = a.status_avaliacao_id where ue.regional_codigo = 1 --codigoRegional(obrigatório) and ue.unidade_codigo = 3 --codigoUnidadeEscolar and res.responsavel_matricula = 3--matriculaResponsavelFiscalizacao and emp.CNPJ = 97643154871 --cnpjEmpresaContratada and c.numero = '12345678901234567890' --numeroContrato and c.tipo_servico_id = 3 --tipoContrato and case when not a.mes_referencia is null then --Ano case when year(a.mes_referencia) = 2012 or 2012 IS NULL then 1 else 0 end when not ub.mes_ano is null then case when year(ub.mes_ano) = 2012 or 2012 IS NULL then 1 else 0 end else 1 end = 1 and case when not a.mes_referencia is null then --Mes case when MONTH(a.mes_referencia) = 1 or 1 IS NULL then 1 else 0 end when not ub.mes_ano is null then case when MONTH(ub.mes_ano) = 1 or 1 IS NULL then 1 else 0 end else 1 end = 1 and case when not a.Semana is null then --Semana case when a.Semana = 2 or 2 IS NULL then 1 else 0 end when not ub.Semana is null then case when ub.Semana = 2 or 2 IS NULL then 1 else 0 end else 1 end = 1 order by ta.tipo desc, ts.nome_servico, c.numero, emp.nome, ue.unidade_nome, a.semana, MONTH(a.mes_referencia), year(a.mes_referencia)
Essa consulta me retorna uma lista.
Eu preciso fazer uma verificação para cada item da lista, se a data dele está compreendida em uma Data Especial, que eu recupero da seguinte forma:
select dte.PERIODOINICIAL, dte.PERIODOFINAL, dte.UNIDADEESCOLARCODIGO, dte.TODASUNIDADESFLAG from DATAESPECIAL dte inner join DATAESPECIALTIPOSERVICO dtets on dte.DATAESPECIALID = dtets.DATAESPECIALID where dte.UNIDADEESCOLARCODIGO = --unidade_escolar_id que retornou da outra consulta and dtets.TIPOSERVICOID = --tipo_servico_id que retornou da outra consulta
Como pode ver, eu preciso usar dois dados que são retornados na outra consulta, aqui nessa consulta.
Com isso eu teria uma lista de Data Especial, e teria de verificar se a data que existe na linha da primeira consulta, está compreendida dentro de qualquer item desse lista de Data Especial.
Deu para entender? Ou ainda está confuso?
Muito obrigado.
Atenciosamente,
Ari Thomazini. Graduado em Ciência da Computação. ITIL V3 Certified Scrum Master Certified MCPD
-
Boa Noite,
O operador CROSS APPLY (ou o OUTER APPLY) poderá ajudá-lo muito nessa tarefa.
[ ]s,
Gustavo Maia Aguiar
Blog: http://gustavomaiaaguiar.wordpress.com
Vídeos:http://www.youtube.com/user/gmasqlClassifique as respostas. O seu feedback é imprescindível
- Marcado como Resposta Harley Araujo quarta-feira, 12 de setembro de 2012 20:23
-
Não vou entrar na questão da performance das consultas.
Uma opção que você tem é jogar o resultado da sua primeira consulta para uma tabela temporária e utilizar esta tabela para a segunda consulta.
Roberson Ferreira - Database Developer
Acesse: www.robersonferreira.com.br
Email: contato@robersonferreira.com.brSe esta sugestão for útil, por favor, classifique-a como útil.
Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.- Marcado como Resposta Harley Araujo quarta-feira, 12 de setembro de 2012 20:23
-