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;