Ir para conteúdo
Fórum Script Brasil
  • 0

Select dentro do Select + Limit


MSA_GT

Pergunta

Bom vou dizer o que preciso e mostrar o q consegui, melhor o q cheguei pois ianda preciso conseguir.

Na tabela de produtos (tabProd) quero só medicação controlada (medControl=S), depois quero que ele me retorne a ultima compra que estão nas seguintes tabelas: Cabeçalho da Entrada (cabEntr) e seus Itens (itmEntr).

As query separadas seriam:

Só Controlados

select prod.codprod, prod.descricao, cab.numentr, cab.dataentr, itm.qtd, itm.valortot, (itm.valortot/itm.qtd) as valoruni
from tabprod as prod
where medcontrol like 'S'
order by descricao

Só a ultima compra do produto=681

select cab.numentr, cab.codfornec, cab.dataentr, itm.codprod, itm.qtdprod, (itm.valortot/itm.qtdprod) as valoruni
from cabentr as cab
inner join itmentr as itm on itm.numentr=cab.numentr
where itm.codprod like '00000681'
order by numentr desc limit 1

Na minha lógica daria certo

select itm.dataentr, prod.codprod, prod.descricao, itm.numentr, itm.qtdprod, itm.valoruni
	from (
		select codprod, descricao 
		from tabprod 
		where  medcontrol like 'S'
	) as prod
	inner join (
		select cab.numentr, cab.codfornec, cab.dataentr, itm.codprod, itm.qtdprod, (itm.valortot/itm.qtdprod) as valoruni
		from cabentr as cab
		inner join itmentr as itm on itm.numentr=cab.numentr
		order by numentr desc LIMIT 1
	) as itm
	on (prod.codprod=itm.codprod)
where prod.codprod='00000681'

Mas não é isso q acontece, se eu deixar o LIMIT ele não retorna nada, se eu tirar ele msotra tudo.

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Eu acho que é isso:

select
    itm.dataentr,
    codprod,
    prod.descricao,
    numentr,
    itm.qtdprod,
    itm.valortot * 1.0 / itm.qtdprod as valoruni
from
    tabprod prod
    inner join
    itmentr itm using(codprod)
    inner join
    cabentr cab using(numentr)
where codprod='00000681' and  prod.medcontrol like 'S'
order by numentr desc
limit 1

Dá pra otimizar assim:

select
    itm.dataentr,
    codprod,
    prod.descricao,
    numentr,
    itm.qtdprod,
    itm.valortot * 1.0 / itm.qtdprod as valoruni
from
    tabprod prod
    inner join
    (
        select distinct on (codprod, numentr) *
        from itmentr
        order by codprod, numentr desc
    ) itm using(codprod)
    inner join
    cabentr cab using(numentr)
where codprod='00000681' and  prod.medcontrol like 'S'

Se você tirar o codprod='00000681' da condição você vai ter a última compra de cada produto.

Mas se você realmente quer apenas um determinado produto:

select
    itm.dataentr,
    codprod,
    prod.descricao,
    numentr,
    itm.qtdprod,
    itm.valortot * 1.0 / itm.qtdprod as valoruni
from
    (
        select *
        from tabprod
        where codprod='00000681' and medcontrol like 'S'
    ) prod
    inner join
    itmentr itm using(codprod)
    inner join
    cabentr cab using(numentr)
order by numentr desc
limit 1
Editado por Kakao
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...