[RESOLVIDO] Usar mesmo alias num Inner Join no mysql

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.

Boa noite amigo…

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

só mudar os alias que funciona…

[]s

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!

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

Da uma olhada…

[code]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;
[/code]

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

Olá Marcos,

[code]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; [/code]

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

Tá dificil essa.

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

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

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…

[code]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; [/code]

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).

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:

[code]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; [/code]

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.

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.

Ah, relaxa…

Já apanhei muito com joins,

Quando precisar pode mandar msgs aí…

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

[]s

Vlw pela camaradagem amigo.

Deu tudo certinho aqui. Abração.