Pegar valores de 3 tabelas no sql

Forum sobre SQL.

Moderador: Moderadores

gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Pegar valores de 3 tabelas no sql

Mensagem por gilbertosilverio »

Olá amigos,

Como faço para poder incluir de uma terceira tabela um campo.

Tenho tres tabelas;

Tray_pedidos
Tray_pedidos_produtos
Tray_Produtos,

O que estou tentando fazer e pegar o código ean que esta na TRAY_PRODUTOS e incluir neste select...

Pelo que pesquisei, creio que devo usar UNION, mais o que e simples para muitos, pra mim nao e... kkkk

Código: Selecionar todos

       SELECT p.pedido,
                   p.sku,
    	           coalesce(p.quantidade,0)  AS ProdutoQtde,
                    coalesce(p.preco,0) as ProdutoPreco ,
                    ped.id, ped.cliente
       FROM tray_pedidos_produtos p
       LEFT JOIN tray_pedidos Ped
       ON p.pedido = Ped.id
       WHERE ped.status LIKE '%enviar%'
       ORDER BY 'ped.id', 'p.pedido'
Como ficaria esse select para conseguir fazer isso.


Grato.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Pegar valores de 3 tabelas no sql

Mensagem por JoséQuintas »

gilbertosilverio escreveu:Pelo que pesquisei, creio que devo usar UNION
De jeito nenhum, UNION é pra juntar registros IGUAIS, por exemplo lista de data e valor de uma tabela e lista de data e valor de outra tabela.

É definir o relacionamento entre as tabelas, como vai pesquisar uma tabela a partir de informação de outra

Vai pesquisar pedidos_produtos a partir do número de pedido.
Vai pesquisar produtos a partir do código de produto em pedidos_produtos

Código: Selecionar todos

select pedidos.idpedido, pedidos_produtos.idproduto, produtos.nome
from pedidos
left join pedidos_produtos on pedidos_produtos.idpedido = pedidos.idpedido
left join produtos on produtos.idproduto = pedidos_produtos.idproduto
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Pegar valores de 3 tabelas no sql

Mensagem por JoséQuintas »

acrescentando clientes:

Código: Selecionar todos

SELECT
   pedidos.idpedido,
   pedidos_produtos.idproduto,
   produtos.nome,
   clientes.cnpj
FROM pedidos
LEFT JOIN pedidos_produto on pedidos_produto.idpedido = pedidos.idpedido
LEFT JOIN produtos on produtos.idproduto = pedidos_produto.idproduto
LEFT JOIN clientes on clientes.idcliente = pedidos_produto.idcliente
se produtos e clientes tem o campo NOME, aí precisaria de um ALIAS pra identificar quem é quem, porque não dá pra ter dois campos NOME no resultado.
pra não complicar, acabei pegando o cnpj... rs
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Pegar valores de 3 tabelas no sql

Mensagem por gilbertosilverio »

Quintas,

Novamente, muito obrigado...

Funcionou perfeitamente.

O duro e que pesquiso, acho um monte de coisa, mais nunca a que preciso, e fico cada vez mais confuso...

Valeu...
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Pegar valores de 3 tabelas no sql

Mensagem por JoséQuintas »

gilbertosilverio escreveu:O duro e que pesquiso, acho um monte de coisa, mais nunca a que preciso, e fico cada vez mais confuso...
Com certeza passei por isso também.
Mas esse já resolve muita coisa, usa no aplicativo praticamente o tempo todo, então já começa a reduzir necessidade de pesquisa.

Correção: continuo passando por isso, porque a gente sempre acaba descobrindo mais recursos e sempre quer usar mais.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Pegar valores de 3 tabelas no sql

Mensagem por alxsts »

Olá!

Em uma modelagem correta de dados, o cliente de um pedido deve obrigatoriamente existir no respectivo cadastro. Da mesma forma, os itens do pedido tem que existir na tabela de produtos (ou serviços). Por esta razão, o tipo de junção indicado é o INNER JOIN. LEFT JOIN deve ser usado quando podem faltar dados em alguma das tabelas (as chamadas tabelas deficientes).
LEFT JOIN clientes on clientes.idcliente = pedidos_produto.idcliente
Aqui também tem erro de modelagem. O Id do cliente deve estar na tabela Pedido e não na ItemPedido.
gilbertosilverio escreveu:O duro e que pesquiso, acho um monte de coisa, mais nunca a que preciso, e fico cada vez mais confuso...
Este material pode ajudar: SQL JOIN: Entenda como funciona o retorno dos dados
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Pegar valores de 3 tabelas no sql

Mensagem por JoséQuintas »

alxsts escreveu:Aqui também tem erro de modelagem. O Id do cliente deve estar na tabela Pedido e não na ItemPedido.
Sim, errei na hora de montar o exemplo.
O cliente fica no pedido e não nos produtos do pedido.

Sobre o JOIN eu ainda prefiro manter o LEFT JOIN na maior parte dos casos.
Mas já tem lugar aonde uso o INNER JOIN.

Pra quem não sabe:

INNER JOIN só pega relacionamento que existe, só pedido com código de cliente que exista cadastrado, e só cliente com pedido cadastrado.
LEFT JOIN, se pedidos vier primeiro, pega TODOS os PEDIDOS, mesmo que o cliente não esteja cadastrado
RIGHT JOIN, se clientes vém depois, pega TODOS os CLIENTES, mesmo que não tenha pedido.
OUTER JOIN, pega pedido sem cadastro e/ou cadastro sem pedido
CROSS JOIN ainda não entendi direito, e não procurei entender, parece que sai tudo de tudo.

No meu entendimento, se quero pedidos de um mês, mesmo que esteja sem código de cliente, aquele pedido pertence ao mês, então deve sair.
NÃO tenho pedido sem código de cliente, o resultado é o mesmo, mas... uso o LEFT mesmo assim.
Como a base veio de DBFs... nunca se sabe...

NÃO SEI se pode ter diferença de velocidade.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Pegar valores de 3 tabelas no sql

Mensagem por alxsts »

Olá!
JoséQuintas escreveu:Sim, errei na hora de montar o exemplo.
Desconfiei desde o princípio.
JoséQuintas escreveu:NÃO SEI se pode ter diferença de velocidade.
Pesquisando com Google "mysql left vs inner join performance" tem várias discussões mas alguns dizem que sim e outros dizem que não. Isto pode depender de muitos fatores, tanto hardware quanto software (modelagem do banco de dados).

O importante, que esqueci de mencionar na minha mensagem anterior, além de ter os índices apropriados, é definir a integridade referencial, ou seja: cada tabela ter suas primary keys e, quando aplicável, os relacionamentos (foreign keys).
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Pegar valores de 3 tabelas no sql

Mensagem por alxsts »

Olá!
OFF TOPIC
Aproveitando este tópico para deixar um abraço e o desejo de muita saúde, felicidades, sucesso e prosperidade.
Foi ontem mas está valendo. Feliz aniversário Gilberto.
[]´s
Alexandre Santos (AlxSts)
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Pegar valores de 3 tabelas no sql

Mensagem por gilbertosilverio »

Olá Alexandre,

Obrigado...
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Responder