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