Fazer um select no MySQL de duas tabelas - caso uma das tabelas não tenha dados,(RESOLVIDO)
21 respostas
murilomenegasso
Bom dia pessoal estou com uma duvida que nao consigo encontrar a solução, estou desenvolvendo um relatório no IREPORT
do estoque de MATÉRIA PRIMA, tenho duas tabelas no banco: ESTOQUE_MAT_PRIMA_ENT e ESTOQUE_MAT_PRIMA_SAI.
Meu select esta assim:
select * from ESTOQUE_MAT_PRIMA_ENT me, ESTOQUE_MAT_PRIMA_SAI ms, MATERIA_PRIMA m where me.codMatPrima = m.idMatMatPrima and ms.codMatPrima = m.idMatMatPrima
Resultado: FALA QUE MEU RELATÓRIO NÃO CONTEM PAGINAS.
Imagino o seguinte, tenho dados na tabela: ESTOQUE_MAT_PRIMA_SAI, mas na outra tabela não tenho nenhum dado! penso que no meu select só daria certo se tivesse dados nas duas tabelas.
Alguém sabe um select que mesmo se alguma das tabelas não contem dados retorna somente dados das outras???
SELECT * FROM Nota, Aluno
WHERE Nota.idAluno = Aluno.idAluno
Pode ser reescrito assim:
SELECT * FROM Nota
INNER JOIN Aluno ON Nota.idAluno = Aluno.idAluno
Agora, se você precisasse listar todos os alunos, mesmo os que não tivessem notas lançadas, você poderia fazer assim:
SELECT * FROM Nota
RIGHT JOIN Aluno ON Nota.idAluno = Aluno.idAluno
pmlm
ViniGodoy:
Não faça JOINs através da cláusula WHERE. O ideal é fazer JOIN com JOIN.
INNER JOIN: Equivalente ao seu WHERE, mas geralmente muito mais rápido;
Actualmente os motores de BD são suficientemente “espertos” para não haver diferenças de performances nesses casos.
ViniGodoy
Na verdade, isso é dependente de implementação. Alguns bancos vão gerar sintaxes algebricamente idênticas (como é o caso do MySQL e do Oracle) e outros não (como é o caso do Microsoft SQL Server).
Agora, uma coisa é fato, para JOINs a clausula JOIN será ou mais eficiente, ou idêntica ao WHERE, nunca pior.
murilomenegasso
Obrigado a todos pela ajuda!!! Agora deu certo!!!
Abs.
murilomenegasso
Pessoal deu certo, mas agora tem um problema eu inclui mais uma Tabela no select veja:
select * from MATERIA_PRIMA m INNER JOIN ESTOQUE_MAT_PRIMA_SAI ms LEFT JOIN ESTOQUE_MAT_PRIMA_ENT me ON
me.codMatPrima = ms.codMatPrima AND
me.codMatPrima = m.idMatMatPrima AND
ms.codMatPrima = m.idMatMatPrima
Acontece o seguinte esta repetindo os valores na quantidade de MATERIA_PRIMA!! o que a de errado???
Oir Romarcio continuo repetindo os valores 51 vezes a mesma qtd de Materia_prima, o q sera?
Zeed01
Boa tarde galera,
Porque você precisa desta clausula:
me.codMatPrima = ms.codMatPrima AND
Sendo que você ja esta fazendo
me.codMatPrima = m.idMatMatPrima AND
ms.codMatPrima = m.idMatMatPrima
?
[]s
romarcio
Nesse caso vc vai ter que colocar no Select os campos que deja exibir, ao invés do *
Dai o campo que repete vc coloca Distinct(CAMPO)
pmlm
Porque tens 51 registos para essa materia prima na tabela ESTOQUE_MAT_PRIMA_SAI ?
murilomenegasso
Cara veja se esta correto:
select DISTINCT Distinct(m.idMatMatPrima), descMatPrima, idMatMatPrima, dataSaiMatPrima,
qtdSaiMatPrima, ms.codMatPrima, ms.obsSaiMatEstoque, dataEntMatPrima, qtdEntMatPrima,
me.codMatPrima, me.obsEntMatEstoque from MATERIA_PRIMA m INNER JOIN ESTOQUE_MAT_PRIMA_SAI ms LEFT JOIN ESTOQUE_MAT_PRIMA_ENT me ON
me.codMatPrima = ms.codMatPrima AND
me.codMatPrima = m.idMatMatPrima AND
ms.codMatPrima = m.idMatMatPrima
Fiz dessa maneira, mesmo assim não resolveu!!!
murilomenegasso
O correto era devolver somente 14 linhas
Mas o que acontece é o seguinte exemplo tenho 3 materias primas e 3 saidas no estoque, veja como fica:
select DISTINCT Distinct(m.idMatMatPrima), descMatPrima, idMatMatPrima, dataSaiMatPrima,
qtdSaiMatPrima, ms.codMatPrima, ms.obsSaiMatEstoque, dataEntMatPrima, qtdEntMatPrima,
me.codMatPrima, me.obsEntMatEstoque from MATERIA_PRIMA m INNER JOIN ESTOQUE_MAT_PRIMA_SAI ms LEFT JOIN ESTOQUE_MAT_PRIMA_ENT me ON
me.codMatPrima = ms.codMatPrima AND
me.codMatPrima = m.idMatMatPrima AND
ms.codMatPrima = m.idMatMatPrima
Fiz dessa maneira, mesmo assim não resolveu!!!
Não, seria assim:
Cara veja se esta correto:
select DISTINCT(m.idMatMatPrima), descMatPrima, idMatMatPrima, dataSaiMatPrima,
qtdSaiMatPrima, ms.codMatPrima, ms.obsSaiMatEstoque, dataEntMatPrima, qtdEntMatPrima,
me.codMatPrima, me.obsEntMatEstoque from MATERIA_PRIMA m INNER JOIN ESTOQUE_MAT_PRIMA_SAI ms LEFT JOIN ESTOQUE_MAT_PRIMA_ENT me ON
me.codMatPrima = ms.codMatPrima AND
me.codMatPrima = m.idMatMatPrima AND
ms.codMatPrima = m.idMatMatPrima
Faça a indicação de qual tabela é cada campo, algumas colunas vc não indicou a qual tabela se refere.
murilomenegasso
Pessoal consegui resolver veja como ficou o código:
SELECT * FROM MATERIA_PRIMA m, ESTOQUE_MAT_PRIMA_SAI ms LEFT JOIN ESTOQUE_MAT_PRIMA_ENT me ON
(me.codMatPrima = ms.codMatPrima) WHERE m.idMatMatPrima = ms.codMatPrima or me.codMatPrima = m.idMatMatPrima