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