Array
(
)

Erro de logica

Only
   - 14 fev 2006

E ae galera, preciso fazer a seguinte consulta: selecionar meus cliente dentro de tbCliente sendo que preciso usar a tbPedidos para separar quem comprou arroz e quem nao comprou feijao. Como faco isso?
lembrando se o mesmo cliente comprou os 2 produtos ele precisa ficar fora da selecao.

Vlw

:D

Aroldo Zanela
   - 15 fev 2006

Colega,

Coloque a estrutura das tabelas (DDL) para facilitar nosso entendimento.

Wcrivelini
   - 16 fev 2006

a primeira coisa a dizer é que, em SQL, normalmente temos mais de uma forma de resolver os problemas.
vou escrever a forma q me parece mais fácil de entender a mecânica do processo.
como nao conheço a estrutura das tabelas q vc tem, vou escrever um SELECT assumindo uma nomenclatura de campos e tabelas.

PREMISSAS:

1. supus q a chave primária na tabela tblCliente seja pkCliente

2. é preciso ter ainda uma tabela de produtos (tblProduto), com chave primaria pkProduto

3. normalmente vc teria uma tabela de pedidos (tblPedido) com dados genéricos do pedido e chave primária pkPedido e chave estrangeira fkCliente.

4. haveria ainda outra tabela com detalhes do pedido (tblPedidoDetalhe), com uma chave primária composta por 2 campos: fkPedido e fkProduto.
considerados separadamente, estes campos são chaves estrangeiras pra junção com as tabelas tblPedido e tblProduto.

5. podemos subdividir esta consulta em vários pequenos passos pra obtermos o resultado desejado. O primeiro passo é identificar os pedidos que tem o produto ARROZ
(SELECT fkPedido FROM tblPedidoDetalhe AS INNER JOIN tblProduto P ON D.fkProduto = P.pkProduto WHERE P.Nome = ´ARROZ´)

6. o segundo, identificar os pedidos do produto FEIJAO
(SELECT fkPedido FROM tblPedidoDetalhe AS INNER JOIN tblProduto P ON D.fkProduto = P.pkProduto WHERE P.Nome = ´FEIJAO´)

7. o terceiro, identificar pedidos/clientes que estão na lista do ARROZ e nao estao na lista do FEIJAO, e para isso precisamos juntar as tabelas de clientes e de pedidos.

SELECT C.*
FROM tblPedido AS T INNER JOIN tblCliente AS C ON T.fkCliente = C.pkCliente
WHERE
T.pkPedido IN (SELECT fkPedido FROM tblPedidoDetalhe AS INNER JOIN tblProduto P ON D.fkProduto = P.pkProduto WHERE P.Nome = ´ARROZ´)
AND
T.pkPedido NOT IN (SELECT fkPedido FROM tblPedidoDetalhe AS INNER JOIN tblProduto P ON D.fkProduto = P.pkProduto WHERE P.Nome = ´FEIJAO´)