Fazer um select no MySQL de duas tabelas - caso uma das tabelas não tenha dados,(RESOLVIDO)

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???

Obrigado!!!

Você já ouviu falar de UNION em SQL?

Além disso, ouviu falar que não é correto criar tópicos totalmente em caixa alta? :slight_smile:

De que tabela queres ver os dados e em que tabela podes não ter dados?

Seguindo o que dizes, que tens dados em uma das tabelas, será isto que queres:

select * from MATERIA_PRIMA m, OUTER ESTOQUE_MAT_PRIMA_SAI ms,  OUTER ESTOQUE_MAT_PRIMA_ENT me,  where me.codMatPrima = m.idMatMatPrima and ms.codMatPrima = m.idMatMatPrima

UNION. Não, vc tem algum exemplo para me passar???
Obrigado!

Amigo esse select esta dando na seguinte parte do select: OUTER ESTOQUE_MAT_PRIMA_SAI ms , OUTER ESTOQUE_MAT_PRIMA_ENT me

Para isso vc pode usar a função LEFT JOIN, procura no google por exemplos, é bem simples de usar.

Aqui vai um exemplo simples:

SELECT * FROM JOBS J LEFT JOIN MY_CONTACTS M ON J.ID_JOB = M.ID_JOB

Nesse caso a tabela da Esquerda(JOBS) cintém dados, a da Diretita(MY_CONTACTS) não contém, então o select vai retornar os dados da tabela da esquerda.

Da uma pesquisa sobre isso.

http://db.apache.org/derby/docs/dev/pt_BR/ref/rrefsqlj18922.html

NÃO USE TÍTULOS EM LETRAS MAIÚSCULAS.

Se a frase acima soou agressiva para você, então seu título também soou agressivo para vários usuários do fórum.

Se não soou, bem, não use títulos em letras maiúsculas mesmo assim. Fica ruim de ler.

Não faça JOINs através da cláusula WHERE. O ideal é fazer JOIN com JOIN.

Existem 3 tipos de JOIN:
INNER JOIN: Equivalente ao seu WHERE, mas geralmente muito mais rápido;
LEFT JOIN: Que inclui todos os itens da tabela A, mesmo que não tenham correspondentes na tabela B;
e RIGHT JOIN: Que inclui todos os itens da tabela B, mesmo que não tenham correspondentes na tabela A;

A título de exemplo, isso aqui:

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

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

Actualmente os motores de BD são suficientemente “espertos” para não haver diferenças de performances nesses casos.

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.

Obrigado a todos pela ajuda!!! Agora deu certo!!!

Abs.

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???

select DISTINCT * 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 

Ve se funciona.

Oir Romarcio continuo repetindo os valores 51 vezes a mesma qtd de Materia_prima, o q sera?

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

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)

Porque tens 51 registos para essa materia prima na tabela ESTOQUE_MAT_PRIMA_SAI ?

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!!!

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:

id=1001 = METAL
id=1002 = AREIA
id=2005 = ORING

1001 METAL - 0,0450 - 08/09/2010
1002 METAL - 0,0065 - 08/09/2010
2005 METAL - 0,1230 - 08/09/2010
1001 AREIA - 0,0450 - 08/09/2010
1002 AREIA - 0,0065 - 08/09/2010
2005 AREIA - 0,1230 - 08/09/2010
1001 ORING - 0,0450 - 08/09/2010
1002 ORING - 0,0065 - 08/09/2010
2005 ORING - 0,1230 - 08/09/2010