Array
(
)

Limitar SELECT

Bruno Teles
   - 08 mar 2016

Boa tarde,
Pessoal, SQL não é minha praia, mas preciso muito de uma ajuda com a questão abaixo, são dados de exemplo e especificamente o que eu quero.
Vamos lá:
Na tabela "Venda" tenho os campos
cod_venda,
nome_peca,
cod_peca,
cliente
...
claro que diferentes clientes compraram o mesmo produto, mas eu precisava a partir de uma listagem de cod_peca trazer somente um cod_venda por cod_peca, um único registro para cada cod_peca que pode ser de qualquer cod_venda, isso não importa e é apenas pra ser usado em um outro processo.
Não é viável eu selecionar todos os dados assim
#Código

SELECT * 
  FROM venda
 WHERE cod_peca IN (100, 200, 300, 400, 500)

e depois separar o que eu quero, pq serão milhares de registros e eu vou perder muito tempo.
Alguém, por favor, sabe de alguma claúsula/forma que consiga me ajudar selecionar esses dados?
Se ficou confuso me sinalizem.

Marcos P
   - 08 mar 2016

Se você precisa apenas eliminar as repetições, faça assim :

#Código

SELECT DISTINCT cod_venda, cod_peca, nome_peca, cliente
FROM venda
WHERE cod_peca IN (100, 200, 300, 400, 500)


Senão for isso, volte aqui e avise...

Bruno Teles
   - 09 mar 2016

Bom dia Marcos,

Essa cláusula não me ajudou pq o campo COD_VENDA é PRIMARY KEY e aí esse código me trouxe os mesmos resultados. Eu preciso de algo que me retornasse apenas um registro do campo COD_PECA não importando a ordem das outras informações. E partir daí eu iria usar os resultados do campo COD_VENDA em um outro processo.

Valeu pela ajuda.

Marcos P
   - 09 mar 2016

#Código

SELECT DISTINCT cod_peca
FROM venda
WHERE cod_peca IN (100, 200, 300, 400, 500)

Bruno Teles
   - 09 mar 2016

Não seria esse meu resultado, eu preciso de algo que me retorne os campos

#Código

SELECT cod_venda, cod_peca, nome_peca, cliente
FROM venda
WHERE cod_peca IN (100, 200, 300, 400, 500);


Mas apenas um registro para cada COD_PECA, pq depois preciso usar o COD_VENDA dos resultados em um outro processo.

Marcos P
   - 09 mar 2016

Sua questão está mal formulada...

Você afirma que precisa de todos os campos, mas apenas um registro de COD_PECA terá utilidade para selecionar ( posteriormente ) COD_VENDA.

Se é apenas um registro de COD_PECA, para que os demais campos ?

Faz o seguinte... vai no SqlFiddle, cria a estrutura de dados e popula a tabela com alguns registros.

Depois, retorna aqui com o link que te ajudo com a query.

Bruno Teles
   - 09 mar 2016

Marcos, não consegui usar o SQLFiddle, tentei diversas maneiras e não tive sucesso, não sei o que ficou faltando ou sobrando, mas...

É mais ou menos assim:

Exemplo:

Se eu utilizar isso

#Código

SELECT * FROM venda WHERE cod_peca IN (100, 200, 300, 400, 500);


Vai me retornar isso

Clique na imagem para abrir em uma nova janela

Eu preciso de algo que me retornasse apenas um registro de cada do campo COD_PECA (de acordo com meu WHERE) não importando a ordem das outras informações. E partir daí eu iria usar os resultados do campo COD_VENDA em um outro processo.

Seria resultado como esse

Clique na imagem para abrir em uma nova janela

Marcos P
   - 09 mar 2016

Bruno,

Os registros selecionados na sua "segunda" consulta são os mesmos da "primeira" consulta... exceto pelo fato que nem todos os registros foram listados na segunda.

Confuso, né mesmo ?!?

Vamos tentar de um outro jeito :

#Código

select nroordem, categoria, codservico, dataatend
from ordserv
where categoria in (select distinct categoria from servicos where categoria_ativa = 1)


Essa query retorna os dados (nroordem, categoria, codservico e dataatend) de TODAS as ordens de serviço em que a categoria está ATIVA.

O que resolve isso é...

#Código
...categoria in (select distinct categoria from servicos where categoria_ativa = 1)


Que é uma subquery que recupera as categorias ativas ( na tabela categoria ) e faz com que a query principal selecione apenas as ordens de serviço em que a cetegoria esteja no conjunto de dados recuperados pela subquery.

Repare que são duas tabelas diferentes, mas nada impede de aplicar a mesma ideia na mesma tabela.

Consegue adaptar e testar ?

Marcos P
   - 09 mar 2016

Em tempo... segue o link no SqlFiddle com sua estrutura e os dados do exemplo acima.

Faabiianooc
   - 09 mar 2016

Veja se isso resolve seu problema.

#Código

select * from (select row_number() over(partition by Cod_Peca order by Cod_Peca) as d,*
from Venda) as v
where d = 1


Essa consulta funciona no SQL Server.

Clique na imagem para abrir em uma nova janela

Marcos P
   - 09 mar 2016

Bruno,

Lendo com calma seu exemplo, creio que o código abaixo resolve seu problema ( a princípio ) em qualquer SGBDr :

#Código

select *
from venda
where cod_venda in (select min(cod_venda)
                    from venda
                    group by cod_peca)
order by Cod_Peca   


Testa e avisa...

Ok ?!?

Bruno Teles
   - 10 mar 2016

É isso mesmo, perfeito, me ajudou muito esse código.

Obrigado Marcos e FaabiianooC.