SQL com consulta complexa.

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
maxmiller
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Seg, 26 Jan 2009 10:08 am
Localização: PB

Tenho as seguintes tabelas
Mercadoria,Organizacao, e LigacaoMercadoriaOrganizacao( que tem as ID das outras duas tabelas). Mercadoria tem uma relacionamento de muitos / muitos com Organizacao por isso tenho LigacaoMercadoriaOrganizacao.
Tenho de fazer o seguinte, quero consultar minhas mercadorias de acordo com as organizacões, mas um detalhe, posso passar n organizações
eu tentei fazer da seguinte forma usando sql normal, mas acredito que tem de ser uma consulta complexa ai.

Selecionar tudo

select * from mercadoria t1, organizacao t2, ligacaomercadoriaorganizacao t3, ligacaomercadoriaorganizacao t4
where t1.id= t3.idmercadoria
and t1.id = t4.idmercadoria
and t2.id = t3.idorganizacao and t2=5
and t2.id = t4.idorganizacao and t2=6
nesse caso seria eu queria a mercadoria que estivesse ligado a organizacao com id 5 e id 6, mas essa consulta não deu certo, estou tentando usar Join mais não entendo muito bem. alguém teria uma solução para essa consulta[/code]
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

Brother,

Na tua tabela de ligação, tu tem que ter os registros para isso...

Ex.:
Tabela ligacaomercadoriaorganizacao:
mercadoria 1, organização 5
mercadoria 1, organização 6

A tua join seria completamente normal.

Não sei se te entendi, qualquer coisa manda ai pra gente.
maxmiller
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Seg, 26 Jan 2009 10:08 am
Localização: PB

Sim minha Tabela ligacaomercadoriaorganizacao tenho os registro, o problema maior é que não sei direito usar o Join. para esse caso teria como dar um exemplo de como usar o Join??[/b]
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

Brother,

Considere as tabelas Ator e Filme
Um ator pode estar em mais de um filme e um filme pode ter mais de um ator. Logo, teremos que ter uma tabela Ator_Filme. Uma tabela para ligar as duas, ok?

O filme Sr e Sra Smith tem os atores Angelina Jolie e Brad Pitt.
Dois registros para nossa tabela de ligação.

Lembra quando tu disse: "nesse caso seria eu queria a mercadoria que estivesse ligado a organizacao com id 5 e id 6"?

Pois é, nesse caso, eu quero que o filme Sr e Sra Smith esteja ligado aos 2 atores.

Logo:

Selecionar tudo

 
select a.desc_ator Ator
         ,f.desc_filme Filme 
 from ator a
        ,filme f
        ,ator_filme af
where f.cod_filme = 1 -- 1 é o código do Sr e s...
         and a.cod_ator = af.cod_ator
         and f.cod_filme = af.cod_filme; 

Selecionar tudo

Ator                   Filme
Angelina Jolie     Sr e Sra Smith
Brad Pitt            Sr e Sra Smith

Enfim, o que eu quero dizer é que é uma join normal...
seria uma query complexa se tu não tivesse essa tabela de ligação, entende?

Espero que tenha ajudado ;)
maxmiller
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Seg, 26 Jan 2009 10:08 am
Localização: PB

Rapaz eu entedi, mas para entendeu meu problema seria melhor o seguinte, tu tem o codigo dos Atores, Angelina Jolie(codigo = 1), e Brad Pitt(codigo=2)
a partir dos atores, como você obteria o filme que eles estão?
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

Tem sim...

Imagina os seguintes registros de nossas tabelas...

Selecionar tudo

Tabela Filme 
Cod_Filme      Desc_Filme
1                   Sr e Sra Smith

Tabela Ator 
Cod_Ator       Desc_Ator
1                   Angelina Jolie
2                   Brad Pitt

Tabela Ator_Filme
Cod_ator        Cod_Filme
1                    1
2                    1
Observe atentamente os registros da nossa tabela Ator_Filme.
O nosso casal de atores está no filme que queremos, certo?

Logo...

Selecionar tudo

select a.desc_ator Ator
         ,f.desc_filme Filme
 from ator a
        ,filme f
        ,ator_filme af
where a.cod_ator in (1,2)
         and a.cod_ator = af.cod_ator
         and f.cod_filme = af.cod_filme; 
Creio que seja isso cara...

Qualquer dúvida, posta ai :-o
maxmiller
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Seg, 26 Jan 2009 10:08 am
Localização: PB

Rapaz funciona, mas esse código ai me da um problema se eu fizer

Selecionar tudo

 where a.cod_ator in (1,3) 
ele ainda me retorna uma linha e nesse caso quero apenas que me retornasse se tivesse os atores 1 e 3 e não 1 ou 3
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

Cara...

Tu tens certeza de que tu queres que traga exatamente os registros que for digitado?

Ex.: Digitar uma sequência de códigos de atores... 20, por exemplo... se um deles não existir naquele filme, não traz NADA?
maxmiller
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Seg, 26 Jan 2009 10:08 am
Localização: PB

isso, exatamente isso, se faltar um ator não trazer nada, só trazer se conter os atores que eu passar
maxmiller
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Seg, 26 Jan 2009 10:08 am
Localização: PB

é porque o seguinte, no que vou usar aqui, ele poderá digitar apenas 3, pois é um filtro, então tem de filtrar usando exatamente os 3 que eu passar, pois o usuario precisa da certeza que a informação que veio pelo filtro é a que ele queria entendeu
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

Cara...

O que tu podes fazer é, a cada parâmetro, criar uma tabela na consulta.

Ex.:

Selecionar tudo

select a.desc_ator Ator
         ,f.desc_filme Filme
 from ator a
        ,filme f
        ,(select af1.cod_ator from ator_filme af1
           where cod_ator = 1) af1
        ,(select af1.cod_ator from ator_filme af2
           where cod_ator = 2) af2
where (af1.cod_ator = a.cod_ator
          or af2.cod_ator = a.cod_ator)
          and f.cod_filme = af.cod_filme; 
Testa isso e vê se dá certo ;)
maxmiller
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Seg, 26 Jan 2009 10:08 am
Localização: PB

cara consegui resolver
fiz da seguinte forma :

Selecionar tudo

select f.*

from filme f
        ator_filme af1,  ator a1,
ator_filme af2, ator 2
where
f.id = af1.idfilme
and af1.idator = a1.id
and a1.id = 5
and
f.id = af2.idfilme
and af2.idator = a2.id
and a2.id = 6;
 
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

Blza...

Maneiras diferentes de se chegar ao mesmo resultado ;)

Até a próxima :-o
Responder
  • Informação
  • Quem está online

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