none
Realizar uma consulta a partir de dados de outra RRS feed

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

    segunda-feira, 10 de setembro de 2012 16:21

Respostas

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

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

    segunda-feira, 10 de setembro de 2012 16:33
    Moderador
  • 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

    segunda-feira, 10 de setembro de 2012 16:38
  • 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.br

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

    segunda-feira, 10 de setembro de 2012 16:56
    Moderador
  • 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

    segunda-feira, 10 de setembro de 2012 17:17
  • 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/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Marcado como Resposta Harley Araujo quarta-feira, 12 de setembro de 2012 20:23
    terça-feira, 11 de setembro de 2012 02:31
  • 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.br

    Se 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
    terça-feira, 11 de setembro de 2012 11:18
    Moderador
  • Obrigado a todos :)

    Ari Thomazini. Graduado em Ciência da Computação. ITIL V3 Certified Scrum Master Certified MCPD

    terça-feira, 11 de setembro de 2012 12:50