I would like to device an SQLite query that finds out whether a person with a certain person_id
has eaten the Fruit
'apple'
but not the fruit 'banana'
. I have access to a Fruit
table that contains information on who has eaten which type of fruit. I would then like to use this information to SELECT
the last name of the person who ate apple
s but not banana
s with a subquery.
In my mind it would go something like this:
SELECT P.last_name FROM Person AS P WHERE P.pid IN ( SELECT F1.pid FROM Fruit AS F1, Fruit AS F2 WHERE F1.pid = F2.pid AND F1.type = 'apple' AND F2.type <> 'banana' ) ORDER BY P.pid;
However, this is not a strict enough condition, as now I’m allowing for the same fruit type in F2
as in F1
, which would still allow that person to be selected. On the other hand I can’t restrict this too much, for example with
F1.type <> F2.type
in the subquery, as that would kick out legitimate persons from the SELECT
ed ones.
What would the restriction have to be to make this work?
Advertisement
Answer
SELECT P.last_name FROM Person AS P WHERE P.pid IN ( SELECT F1.pid FROM Fruit AS F1 LEFT JOIN Fruit AS F2 ON F2.type = 'banana' AND F1.pid = F2.pid WHERE F1.type = 'apple' AND F2.pid IS NULL ) ORDER BY P.pid;