none
Select com duas tabelas Carros e Fotos mostrar tudo em um registro

    Question

  • Seguinte eu tenho duas tabelas Carros e Fotos

    EU quero fazer um select para mostrar um registro em cada linha mas com as três imagens em campos criados em tempo de execução

    Tabela de carro
    id – carro – ano

    Tabela de fotos
    id – idcarro – foto

    Ai quando eu fizer o select eu quero trazer da seguinte forma

    Id – carro – ano – foto1 – foto2 – foto3
    e claro não repetir o registro na próxima linha

    Tem como?


    http://www.devcursos.com.br
    Tuesday, November 24, 2009 5:40 PM

Answers

  • Boa tarde,

    Fiz o seguinte exemplo, creio que te ajude a sanar sua dúvida:

    create table carro(
    id int primary key,
    carro varchar(200),
    ano int)

    create table fotos(
    id int primary key,
    idcarro int references carro(id),
    foto varchar(max))
    go

    insert into carro
    values (1, 'Carro1', 2002)
    insert into carro
    values (2, 'Carro2', 2003)
    insert into fotos
    values (1, 1, 'Foto1.1')
    insert into fotos
    values (2, 1, 'Foto2.1')
    insert into fotos
    values (3, 1, 'Foto3.1')
    insert into fotos
    values (4, 2, 'Foto1.2')
    insert into fotos
    values (5, 2, 'Foto2.2')
    go

    ;with cte as
    (
     select
     id,
     idcarro,
     foto,
     row_number() over (partition by idcarro order by id) as ordem
     from fotos
    )

    select c.id, c.carro, f1.foto, f2.foto, f3.foto, c.ano
    from carro c
    left join cte f1 on f1.idcarro = c.id and f1.ordem = 1
    left join cte f2 on f2.idcarro = c.id and f2.ordem = 2
    left join cte f3 on f3.idcarro = c.id and f3.ordem = 3
    go

    drop table fotos
    drop table carro
    go


    Paulo R. Pereira
    www.sqlfromhell.com

    Obs.: Se a resposta for útil não se esqueça de marcar. Obrigado!
    Thursday, November 26, 2009 4:13 PM

All replies

  • Olá

    Quanto a query, faça assim:

    Select Car.Id, Car.carro, Car.ano, Fot.foto
    from Tabela_de_carro Car
    inner join Tabela_de_fotos Fot
    on Car.ID=Fot.IDCarro
    

    Agora para exibir as fotos, vai depender da linguagem que vc esta programando

    att

    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    Tuesday, November 24, 2009 6:12 PM
  • Opa... Vc quer pivotar as fotos? E tem que ser dinamico? Tipo, se vc tiver 20 fotos, vc vai querer 20 colunas (foto1, foto2, foto3,..., foto20)?

    Sinceramente... qual é sua necessidade especifica para fazer isso?

    Att





    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    Tuesday, November 24, 2009 6:15 PM
  • Não, serão somente 3 fotos
    http://www.devcursos.com.br
    Tuesday, November 24, 2009 6:27 PM
  • Nao tem jeito.... Nao existe nada na sua estrura que identifique o que é foto 1, 2 ou 3.

    A nao ser que esta informaçao esteja no ID da tabela de fotos, por exemplo:
    id   idcarro  foto 
    1    1          <bin>
    2    1          <bin>
    3    1          <bin>
    1    2          <bin>
    2    2          <bin>
    3    2          <bin>
    1    3          <bin>
    2    3          <bin>
    3    3          <bin>

    Agora se o ID da sua tabela de fotos, for sequencial (identity), esqueça!! 

    Ainda nao entendi o motivo de pivotar as fotos!!

    Att



    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    Tuesday, November 24, 2009 6:38 PM
  • Lontra,

    Você conseguiu solucionar o seu problema?
    Caso afirmativo poste a solução para que outras pessoas se beneficiem.

    Att,
    Fernanda


    “Caso esta resposta tenha ajudado a solucionar sua dúvida, favor clicar em “Marcar como Resposta” para beneficiar outros membros da comunidade que estejam lendo este thread”.
    Thursday, November 26, 2009 1:22 PM
  • Boa tarde,

    Fiz o seguinte exemplo, creio que te ajude a sanar sua dúvida:

    create table carro(
    id int primary key,
    carro varchar(200),
    ano int)

    create table fotos(
    id int primary key,
    idcarro int references carro(id),
    foto varchar(max))
    go

    insert into carro
    values (1, 'Carro1', 2002)
    insert into carro
    values (2, 'Carro2', 2003)
    insert into fotos
    values (1, 1, 'Foto1.1')
    insert into fotos
    values (2, 1, 'Foto2.1')
    insert into fotos
    values (3, 1, 'Foto3.1')
    insert into fotos
    values (4, 2, 'Foto1.2')
    insert into fotos
    values (5, 2, 'Foto2.2')
    go

    ;with cte as
    (
     select
     id,
     idcarro,
     foto,
     row_number() over (partition by idcarro order by id) as ordem
     from fotos
    )

    select c.id, c.carro, f1.foto, f2.foto, f3.foto, c.ano
    from carro c
    left join cte f1 on f1.idcarro = c.id and f1.ordem = 1
    left join cte f2 on f2.idcarro = c.id and f2.ordem = 2
    left join cte f3 on f3.idcarro = c.id and f3.ordem = 3
    go

    drop table fotos
    drop table carro
    go


    Paulo R. Pereira
    www.sqlfromhell.com

    Obs.: Se a resposta for útil não se esqueça de marcar. Obrigado!
    Thursday, November 26, 2009 4:13 PM