Jump to content

Relacionar duas tabelas com "tabela temporária"


Parzival

Recommended Posts

Boas, 

Eu tenho o objetivo de tentar relacionar a tabela «ROTAS» com «PRODUTOS» onde irei criar a tabela «CARGA» para ajudar(eu acho😅)

ROTAS(ID_ROTA, ID_CAMIAO, ID_CLIENTE, ID_CARGA)

 

CARGA(ID_CARGA, "aqui eu iria criar uma tabela 'temporaria' «PRODUTO_CARGA»")

|------------CARGA---------- |

|    id_carga   |  aqui supostamente o id da tabela(produto_carga)      |

|        213       |       27        |

 

PRODUTO_CARGA(ID_PRODUTO, QNT)

|---PRODUTO_CARGA--- |

|  id_produto  |     QNT      |

|        213       |       27        |

|etc...

 

PRODUTO(ID_PRODUTO, NOME, MARCA, VALOR)

Mas como consigo fazer a parte de ir buscar uma tabela inteira e não so uma "row"?
Agradeço desde já:)

 

FOTO DA BASE DE DADOS (phpMyAdmin DESIGNER)

Edited by Parzival
esquecime de colocar imagem

"One day or day one, you decide."

Link to comment
Share on other sites

Não sei se percebi bem o que pretendes, mas o que tens descrito no texto e o que tens descrito na imagem do modelo relacional não é a mesma coisa.
Ignorando o que tens na imagem e focando exclusivamente no que tens aqui no texto: a tua base de pensamento está quase totalmente correta.
As tuas "falhas" são:

  1. na questão da tabela temporária "carga" que não tem nada de temporária e não irá apontar para a tabela "produto_carga".
  2. a tabela "produto_carga" tem de fazer a ligação entre um produto e uma carga, logo tem de ter uma chave para a tabela "carga"

Depois é só fazeres a query começando na "carga" e ires percorrendo as tabelas até chegares à tabela "produtos":

select rotas.*, produtos.*
from  rotas
inner join carga 
 on rotas.id_rota = carga.id_rota
inner join produto_carga
 on carga.id_carga = produto_carga.id_carga
inner join produtos
  on produto_carga.id_produto = produto.id_produto

 

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

  • 1 month later...
On 12/9/2022 at 3:19 PM, M6 said:

Não sei se percebi bem o que pretendes, mas o que tens descrito no texto e o que tens descrito na imagem do modelo relacional não é a mesma coisa.
Ignorando o que tens na imagem e focando exclusivamente no que tens aqui no texto: a tua base de pensamento está quase totalmente correta.
As tuas "falhas" são:

  1. na questão da tabela temporária "carga" que não tem nada de temporária e não irá apontar para a tabela "produto_carga".
  2. a tabela "produto_carga" tem de fazer a ligação entre um produto e uma carga, logo tem de ter uma chave para a tabela "carga"

Depois é só fazeres a query começando na "carga" e ires percorrendo as tabelas até chegares à tabela "produtos":

select rotas.*, produtos.*
from  rotas
inner join carga 
 on rotas.id_rota = carga.id_rota
inner join produto_carga
 on carga.id_carga = produto_carga.id_carga
inner join produtos
  on produto_carga.id_produto = produto.id_produto

 

Pode tentar explicar um bocado o código SQL que colocou aqui:

On 12/9/2022 at 3:19 PM, M6 said:
select rotas.*, produtos.*
from  rotas
inner join carga 
 on rotas.id_rota = carga.id_rota
inner join produto_carga
 on carga.id_carga = produto_carga.id_carga
inner join produtos
  on produto_carga.id_produto = produto.id_produto

Não consegui entender muito bem. Como funciona o INNER JOIN e assim. Já pesquisei na internet e não consegui entender a sintaxe nem como funciona. Será que me pode explicar?

"One day or day one, you decide."

Link to comment
Share on other sites

O InnerJoin selecciona apenas os registos que exitem em ambas as tabelas através dos campos definidos na cláusula On.

Por exemplo, em

select rotas.*, carga.*
from  rotas
inner join carga 
 on rotas.id_rota = carga.id_rota

Vais ter todas as rotas para as quais existe carga, ou seja, vais escolher apenas os registos que existem em ambas as tabelas carga e rota que se relacionam através dos campos referidos na cláusula On. Se houver rotas sem carga, essas rotas não vão aparecer.
Podes ver isso se tiveres registos na tabela de rotas para os quais não há registos na tabela de carga. Exemplo: tens uma rota com o id_rota = 23 mas ainda não tens carga para essa rota (não existe nenhum registo na tabela carga com o valor 23 na coluna id_rota), esse registo da rota não vai aparecer.
Se tiveres nas tuas tabelas situações dessas, quando executares essa query vais ver que vais ter sempre registos totalmente listados, tanto na parte da rotas.* como na parte da carga.*, mas só são listados os registos que existam em ambas as tabelas.

Já se fizeres um Left Join:

select rotas.*, carga.*
from  rotas
left join carga 
 on rotas.id_rota = carga.id_rota

Vais ter todas as rotas quer exista, ou não, carga para as mesmas.
Seguindo o exemplo acima da rota que não tem ainda carga, vais ver que vão sair todos os registos que obtiveste anteriormente com o InnerJoin mais aqueles para os quais ainda não há carga. Vês isso de forma simples: os registos de rota.* estão sempre preenchidos e os registos de carga.* estão preenchidos caso existam senão são listados a null/vazios.

Este artigo explica bem (com diagramas de Venn e exemplos) esta questão do InnerJoin, LeftJoin (e afins): https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
Uma dica: ignora e não tentes perceber mas nada antes de compreenderes o InnerJoin e o LeftJoin nas suas expressões mais simples. Depois disso vai ser simples compreender o resto, como por exemplo que o RightJoin é a mesma coisa que o LeftJoin mas aplicado invesamente às tabelas (pelos diagrama percebes logo).

 

Edited by M6
  • Vote 1
10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.