consultinha entre duas tabelas

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
NaPraia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 88
Registrado em: Sex, 22 Fev 2008 8:24 am
Localização: Floripa - SC

Beleza gente,
seguinte, estou com um probleminha que parece simples, mas estou patinando.
Tenho duas tabelas:

Selecionar tudo

--------------
|  MARCAS    |
--------------
|FIAT        |
|FORD        |
|GM          |
|VW          |
--------------
e

Selecionar tudo

-----------------
|    CARROS     |
-----------------
|UNO    |FIAT   |
|FIESTA |FORD   |
|PALIO  |FIAT   |
|GOL    |VW     |
-----------------
quero fazer um select que me traga as marcas que estão na tabela MARCAS e o nome
dos carros que estão na tabela CARROS, só que a marca não pode repetir.
como no exemplo que passei, tem que aparece a marca FIAT, mas com a descrição
do carro como PALIO ou UNO, tanto faz, mas não os dois.

eu tentei fazer assim

Selecionar tudo

select marcas.descricao,
(select carros.descricao from carros where carros.marcas = marcas.descricao and rownum = 1) car
from marcas
mas dá o erro:

Selecionar tudo

PLS-00103: Encountered the symbol "SELECT"
isso porque está dentro de um cursor.
Estranho que numa outra base fiz a mesma coisa e fucionou.

caso eu não precisasse mostrar o nome do carro, podia fazer um join e dar um distinct.
No caso, eu nem preciso mostrar a descrição do carro, mas o grande problema é que o cliente quer que eu order pelo nome do carro.

Alguém sabe de alguma forma que eu possa fazer?
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

Selecionar tudo

select distinct marcas.descricao, carros.descricao
 from carros, marcas
where carros.marcas = marcas.descricao
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Qual a versão do banco?

Poderia fazer uma function, que o parametro de entrada fosse a marca, e então você busca la dentro o MIN pór data qualquer coisa e então retorna o carro,
NaPraia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 88
Registrado em: Sex, 22 Fev 2008 8:24 am
Localização: Floripa - SC

Vitor, assim a consulta vai me trazer os dois carros da FIAT e só quero que venha um

Diego, o banco é o 8i
até vou dar uma olhada se rola algo simples, é que a procedure é grande e é rodada por mais de 200 clientes e só um quer mudar a ordenação.
Nem sei se vale a pena ter todo esse trabalho
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Oracle 8i, foi o que imaginei, não aceita select na clausula select, se você jogar o conteudo do seu sql que ta na clausula select e fizer uma function funciona...

;)
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Já tinha SQL analítico no Oracle 8i, então deve dar para usar a mesma tática do 11g mesmo, com row_number para fazer uma top-n query:

Selecionar tudo

select desc_marca,
       desc_carro
  from (select m.descricao desc_marca,
               c.descricao desc_carro,
               row_number() over (partition by m.descricao order by c.descricao) rn
          from carros c, marcas m
         where c.marcas = m.descricao)
 where rn = 1
Tanto faz qual dos carros da marca mostrar? Nesse caso pus order by no nome do carro, o que quer dizer que vai mostrar o 1o carro de cada marca apenas, em ordem alfabética.
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Uma variação do que o fsitja comentou...
Retorna o primeiro carro que encontrar.
Se você quiser, pode ordenar por nome de carro, etc.

Selecionar tudo

SELECT DISTINCT m.descricao
               ,first_value(c.descricao) OVER(PARTITION BY m.descricao)
  FROM carros c
      ,marcas m
 WHERE c.marcas = m.descricao
NaPraia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 88
Registrado em: Sex, 22 Fev 2008 8:24 am
Localização: Floripa - SC

obrigado pela dicas, depois vou dar uma olhada que apareceram coisas mais urgentes e isso ficou para trás
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes