[RESOLVIDO] Usar mesmo alias num Inner Join no mysql

12 respostas
ERVER

Boa noite pessoas,

Segue minha sql:

SELECT n.id_nota, nl.id_lote, hl.id_historico_lote FROM nota n INNER JOIN notas_lote nl ON nl.id_nota = n.id_nota INNER JOIN lote l ON l.id_lote = historico_lote.id_lote INNER JOIN nl ON notas_lote.id_lote = l.id_lote INNER JOIN movimentacao_lote ml ON ml.id_historico_lote = historico_lote.id_historico_lote INNER JOIN ml movimentacao_lote ON movimentacao_lote.id_lote = lote.id_lote INNER JOIN nl ON nl.id_lote = ml.id_lote INNER JOIN n ON n.id_fornecedor = fornecedor.id_fornecedor INNER JOIN hl ON historico_lote.id_estado_interno = estado_nota_interno.id_estado_interno INNER JOIN usuario u ON u.id_depto_usuario = depto.id_depto INNER JOIN n ON n.id_fornecedor = fornecedor.id_fornecedor ORDER BY n.id_nota;

O problema é o seguinte: como uso um mesmo alias várias vezes (como o ml e nl), o mysql acusa o erro 1066 (como se eu estivesse tentando declarar varios alias com o mesmo nome).
Acho que to declarando os alias no lugar errado. Alguem sabe onde é o local certo?

Muito obrigado desde já. Abraços.

12 Respostas

marcoscbrito

Boa noite amigo…

O problema é justamente vc usar o mesmo alias várias vezes…

só mudar os alias que funciona…

[]s

ERVER

Boa noite amigo,

Primeiramente, muito obrigado por ajudar aqui.

Então, vou ter que usar um alias diferente pra cada vez que for referenciar uma mesma tabela?

Muito obrigado novamente, abração!

marcoscbrito

No caso de utilizar a mesma tabela, você pode usar and's nos inner join.

Da uma olhada...

SELECT 
n.id_nota, 
nl.id_lote, 
hl.id_historico_lote 

FROM  nota n 
INNER JOIN notas_lote nl 
	ON nl.id_nota = n.id_nota  
	and nl.id_lote = l.id_lote  
	and nl.id_lote = ml.id_lote
	and n.id_fornecedor = fornecedor.id_fornecedor  

INNER JOIN lote l 
	ON l.id_lote = historico_lote.id_lote  


INNER JOIN movimentacao_lote ml 
	ON ml.id_lote = l.id_lote
	and ml.id_historico_lote = hl.id_historico_lote  
	

INNER JOIN ml movimentacao_lote 
	ON movimentacao_lote.id_lote = lote.id_lote  

INNER JOIN hl 
	ON hl.id_estado_interno = estado_nota_interno.id_estado_interno  
INNER JOIN usuario u 
	ON u.id_depto_usuario = depto.id_depto  

ORDER BY n.id_nota;

fiz essa query por cima, estou sem mysql aq pra validar, mas a idéia é mais ou menos essa...
desse jeito você não precisa declarar várias vezes a mesma tabela...

Espero ter ajudado....

[]s

ERVER

Olá Marcos,

SELECT   
n.id_nota,   
nl.id_lote,   
hl.id_historico_lote   
  
FROM  nota n   
INNER JOIN notas_lote nl   
    ON nl.id_nota = n.id_nota    
    and nl.id_lote = l.id_lote    
    and nl.id_lote = ml.id_lote  
    and n.id_fornecedor = fornecedor.id_fornecedor    
  
INNER JOIN lote l   
    ON l.id_lote = historico_lote.id_lote    
  
  
INNER JOIN movimentacao_lote ml   
    ON ml.id_lote = l.id_lote  
    and ml.id_historico_lote = hl.id_historico_lote    
      
  
INNER JOIN movimentacao_lote  
    ON movimentacao_lote.id_lote = lote.id_lote    
  
INNER JOIN historico_lote hl   
    ON hl.id_estado_interno = estado_nota_interno.id_estado_interno    
INNER JOIN usuario u   
    ON u.id_depto_usuario = depto.id_depto    
  
ORDER BY n.id_nota;

Agora diz que a coluna l.id_lote da linha 9 não existe.

Tá dificil essa.

ERVER

Já tentei trocar por lote.id_lote e dá o mesmo erro: coluna desconhecida.

ERVER

Acho que o problema é que não declarei essas tabelas no FROM ainda. É isso mesmo?

marcoscbrito

Ah, eh pq como estou sem sql fiz sem validar, as tabelas só podem ser usadas pro join dpois que já foram declaradas, senão da isso mesmo.... :XD:

ve se melhora agora....

SELECT   
n.id_nota,   
nl.id_lote,   
hl.id_historico_lote   
  
FROM  nota n   
INNER JOIN notas_lote nl   
    ON nl.id_nota = n.id_nota    

INNER JOIN fornecedor f
    on f.id_fornecedor = n.id_fornecedor    
  
INNER JOIN lote l   
    on l.id_lote = nl.id_lote 

INNER JOIN historico_lote hl   
    ON hl.id_lote = l.id_lote   

INNER JOIN movimentacao_lote ml   
    ON ml.id_lote = l.id_lote  
    and ml.id_historico_lote = hl.id_historico_lote    
    and ml.id_lote = nl.id_lote     

INNER JOIN estado_nota_interno en
    ON en.id_estado_interno = hl.id_estado_interno    

INNER JOIN usuario u   
    ON u.id_depto_usuario = depto.id_depto    
  
ORDER BY n.id_nota;
ERVER

To muito perdido nisso, já usei INNER JOIN muitas vezes, mas é primeira em que uso em mais de 3 tabelas, por isso tô confuso. A query que preciso já consegui fazendo a relação apenas na condição (WHERE), mas isso da uma boa perda de desempenho, sem contar que essa forma de escrever sql já deixou de ser utilizada há um bom tempo.

Tô o dia inteiro tentando resolver isso, se puder continuar a me ajudar, ficarei muito grato (mais ainda do que já estou por toda a sua ajuda agora).

ERVER

Marcos,

Muito obrigado!

Acho que entendi como funciona:
Só tava faltando fazer a relação do departamento com o lote, coloquei e deu certo!

Agora é só realizar o filtro como WHERE. Se não der certo volto a te encher a paciência outra hora, rs. Brincadeira.

Segue o código:

SELECT     
n.id_nota,     
nl.id_lote,     
hl.id_historico_lote     
    
FROM  nota n     
INNER JOIN notas_lote nl     
    ON nl.id_nota = n.id_nota      
  
INNER JOIN fornecedor f  
    on f.id_fornecedor = n.id_fornecedor      
    
INNER JOIN lote l     
    on l.id_lote = nl.id_lote

INNER JOIN departamento depto
	on l.id_depto_atual = depto.id_depto
  
INNER JOIN historico_lote hl     
    ON hl.id_lote = l.id_lote     
  
INNER JOIN movimentacao_lote ml     
    ON ml.id_lote = l.id_lote    
    and ml.id_historico_lote = hl.id_historico_lote      
    and ml.id_lote = nl.id_lote       
  
INNER JOIN estado_nota_interno en  
    ON en.id_estado_interno = hl.id_estado_interno      
  
INNER JOIN usuario u     
    ON u.id_depto_usuario = depto.id_depto      
    
ORDER BY n.id_nota;

Pelos acertos que você fez no meu código entendi melhor como funciona o INNER JOIN em várias tabelas.

Muito, mas muito obrigado mesmo amigo!

Um grande abraço, fique com Deus.

ERVER

PS: não foi preguiça de pesquisar sobre o assunto, o livro de SQL que andei estudando é de 2002, nem tem INNER JOIN nele, e pelo google achei muitos exemplos, mas todos confusos. Com a sua ajuda entendi muito melhor.
Vou fazer os ultimos ajustes na query aqui, e assim que terminar e ela funcionar, coloco o tópico como resolvido.

Muito obrigado novamente. Abraços.

marcoscbrito

Ah, relaxa…

Já apanhei muito com joins,

Quando precisar pode mandar msgs aí…

Não esquece de marcar o tópico como [RESOLVIDO]

[]s

ERVER

Vlw pela camaradagem amigo.

Deu tudo certinho aqui. Abração.

Criado 14 de agosto de 2012
Ultima resposta 14 de ago. de 2012
Respostas 12
Participantes 2