SQLouco

SQLouco

por Claudio Henrique Pizarro da Silva -
Número de respostas: 1

Em relação ao ex2 lista12, o código abaixo deveria retornar uma lista de produtores que não produzem cebola, porém na resposta aparecem agricultores que produzem a !@#$%!@%!#$ da cebola.

Por favor, o que foi feito de errado?

SELECT a.CodA

FROM Agricultor a, Produto p, Entrega e

WHERE a.CodA = e.CodA AND p.CodP = e.CodP AND p.NomeP != 'cebola';

Em resposta à Claudio Henrique Pizarro da Silva

Re: SQLouco

por Rafael Sampaio -

Oi, Henrique:

Acho que você precisa tomar cuidado com o que quer responder. Nesse bd, não temos como saber o que cada agricultor produz, e sim o que eles já entregaram. (Observe que os itens 'e' e 'f' usam também essa expressão.)

Supondo agora que você queira responder quais agricultores nunca entregaram cebolas, note que você precisa saber primeiro quais entregaram. Por quê? Porque um agricultor pode ter entregado cebola e algum outro produto a um restaurante. Esse é o erro na sua consulta: você exclui os agricultores que já entregaram cebola, mas eles entregaram outros produtos, logo os códigos deles aparecem no resultado da consulta.

Um jeito simples de fazer seria este:

SELECT DISTINCT CodA FROM Entrega WHERE codA
NOT IN (
        SELECT DISTINCT CodA FROM Entrega WHERE codP = 2003
);

A consulta interna me devolve todos os códigos (distintos) de quem já entregou cebola e a consulta mais externa me devolve todos os códigos (distintos) daqueles que não estão entre os que entregaram cebola. E aí você verá que apenas o poeta Oswald não gostava das cebolas! sorriso

Existem outras formas de escrever essa consulta. Pense nisso!

Abraço,
Rafael