• 0
Sign in to follow this  
m3io

Consulta Com 3 tabelas um para muitos

Question

Boas Pessoal, estou aqui com um problema que não consigo resolver e precisava da vossa ajuda

é assim

Tenho 1 sistema para requisitar revistas

- so existe uma revista de cada (1exemplar) logo ao ser requisitada não pode mais aparecer na lista ate ser entregue .

-objectivo é ter uma lista em um formulario que mostra todas as revistas disponiveis, mas como tenho o campo entregue (sim/não) na tabela requisicao tenho que verificar se a revista já foi requisitada e se foi se foi entregue

é esta condicao que estou a testar fazer ,

mas de algum jeito não estou entrando bem na onda.

tenho aqui o sql que já fiz, mas acho que estou a pensar na logica errada

SELECT revista.revista, rev_req.rev_id
FROM revista INNER JOIN (requisicao INNER JOIN rev_req ON requisicao.id = rev_req.req_id) ON revista.id_rev = rev_req.rev_id
WHERE (((Exists (SELECT * FROM requisicao WHERE entregue = Yes))=True));

relw.png

Sera que alguém me consigo dizer o que estou fazendo errado.

Obrigado pela vossa ajuda

Cumprimentos

Share this post


Link to post
Share on other sites

10 answers to this question

Recommended Posts

  • 0

select distinct r.revista from revista r, rev_req x, requisicao y where r.id_rev=x.rv_id and x.req_id=y.id and y.entregue='sim' order by r.revista

Veja se isso ajuda! Por favor dê um feedback mesmo que não funcione!

Share this post


Link to post
Share on other sites
  • 0

Obrigado pela resposta, mas infelizmente não resolveu o meu problema :wacko:

rel2h.png

Eu já consegui listar todas as disponiveis das requisições, o problema é mesmo que não consigo listar tambem as que nunca foram requisitadas

para todas as disponiveis nas requisições usei

SELECT DISTINCT revista.revista, requisicao.entregue
FROM requisicao INNER JOIN (revista INNER JOIN rev_req ON revista.id_rev = rev_req.rev_id) ON requisicao.id = rev_req.req_id
WHERE (((requisicao.entregue)=Yes));

mas sera que existe alguma maneira de juntar elas com aquelas revistas que nunca foram sequer requisitadas?

Obrigado

Share this post


Link to post
Share on other sites
  • 0

Não seria simplesmente colocar um 'id_revista' no tabela de requisicao e relacionar apenas 2 tabelas? Eu entendi que cada revista é individual e cada uma tem um estado diferente, (entregue/não entregue)

No meu select anterior, veja se resolve:

select distinct r.revista from revista r, rev_req x, requisicao y where r.id_rev=x.rv_id and x.req_id=y.id and ( y.entregue='sim' or y.datar="") order by r.revista

Share this post


Link to post
Share on other sites
  • 0

Sandro2011 muito obrigado pelos seus feedbacks.

não , se eu tivesse o d_revista na tabela requisicao so poderia ter uma unica revista por cada requisicao, mas não é o caso.

mas sim eu tenho uma requisicao com varias revistas e cada uma delas é unica.

Essa query como a anterior fazem um pop.up

Valor do parametro
x.rv_id
________________

não entendo é como faz isso de dar outros nomes as tabelas, e não ter inner join :(

estou farto de procurar solucao e ler tutoriais e não consigo resolver :(

Share this post


Link to post
Share on other sites
  • 0

Olá novamente,

M3io, o que você quer fazer é fazer tipo um pedido de revistas, cada pedido pode ter várias revistas, e controlar se o pedido foi entregue ou requisitado?

Share this post


Link to post
Share on other sites
  • 0

M3io, não sei se você observou, mas naquele select que eu enviei tem um erro: onde está x.rv_id é x.rev_id

M3io, veja se resolve isso:

select distinct r.revista from revista r, rev_req x, requisicao y where r.revista not in (select distinct r.revista from revista r, rev_req x, requisicao y where r.id_rev=x.rev_id and x.req_id=y.id and ( y.entregue='sim' or y.datar="")) order by r.revista

nessa consulta, aqui em casa eu consegui ver as revistas que não estão nas requisições.

Share this post


Link to post
Share on other sites
  • 0

Boas de novo, era exactamente isso que eu tentei fazer logo a primeira vez mas nunca conseguia acertar na logica

mas...

continua com problemas de syntax :wacko:

rel3.png

onde eu errei??? tentei colocar ";" no final, tentei colocar as palavras reservadas em maiusculas

mas dao deu certo de nenhuma maneira, estou a usar o access 2007 sera isso?

Share this post


Link to post
Share on other sites
  • 0

Esse funciona , já encontrei a syntax certa e devolve-me os valores correctos, Mas ao usar isso num sub formulario da requisicao não me deixa escolher os valores porque diz que não tem onde os guardar...

mais tarde liguei eu as tabelas com inner join e voltei á estaca zero , e passou de novo so a devolver quem já foi entregue esquecendo quem nunca foi requisitado

..

Share this post


Link to post
Share on other sites
  • 0
Boas de novo, era exactamente isso que eu tentei fazer logo a primeira vez mas nunca conseguia acertar na logica

mas...

continua com problemas de syntax :wacko:

rel3.png

onde eu errei??? tentei colocar ";" no final, tentei colocar as palavras reservadas em maiusculas

mas dao deu certo de nenhuma maneira, estou a usar o access 2007 sera isso?

M3io, pela imagem não está dando para ver, mas será que o access não aceita 'aspas' na comparação de strings?

troque:

y.entregue='sim' or y.datar="" (2 aspas)

por

y.entregue='sim' or y.datar='' (2 apostrofes)

Esse funciona , já encontrei a syntax certa e devolve-me os valores correctos, Mas ao usar isso num sub formulario da requisicao não me deixa escolher os valores porque diz que não tem onde os guardar...

mais tarde liguei eu as tabelas com inner join e voltei á estaca zero , e passou de novo so a devolver quem já foi entregue esquecendo quem nunca foi requisitado

..

Você está fazendo a aplicação no access? infelizmente um não entendo nada de access, somente alguma coisa de SQL. Uso SQL em aplicações no PHP. Boa Sorte!

Share this post


Link to post
Share on other sites
  • 0

amigo, acredito que sua logica está errada.

ao invés de ter um campo sim/não.. eu faria o seguinte:

use os campos que você já tem de datas: datar e datae

crie uma consulta simples de nome CONS_REV_IND com a tabela REQUISICAO usando criterio nos campos DATAR e DATAE:

DATAR = NOT NULL

DATAE = IS NULL

isso trará as revistas que estão indisponiveis.

então crie uma nova consulta usando a tabela REVISTA e a consulta CONS_REV_IND

faça um relacionamento do tipo LEFT JOIN entre REVISTA e CONS_REV_IND pelo campo ID da revista

adicione na consulta pelo menos os campo revista.id_rev e depois CONS_REV_IND.id usando criterio neste ultimo = IS NULL

assim a consulta te retornara todas as revistas cadastradas menos aquelas que estão requisitadas e não tiveram data de entrega lançada.

abraços

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this