I’m struggling with the following SQL problem: I must query all persons that do not know anyone who takes classes, using the following tables:
x
╔═════════╦════════╦═══════════╦═════╗
║ Persons ║ ║ ║ ║
╠═════════╬════════╬═══════════╬═════╣
║ id ║ name ║ address ║ age ║
║ 1 ║ Teddy ║ Utrecht ║ 96 ║
║ 2 ║ Harun ║ Texas ║ 64 ║
║ 3 ║ Egbert ║ Rome ║ 68 ║
║ 4 ║ John ║ Amsterdam ║ 39 ║
╚═════════╩════════╩═══════════╩═════╝
╔═══════╦════════════╦════════════╗
║ Knows ║ ║ ║
╠═══════╬════════════╬════════════╣
║ id ║ personA_id ║ personB_id ║
║ 25 ║ 1 ║ 2 ║
║ 26 ║ 1 ║ 3 ║
║ 27 ║ 3 ║ 2 ║
║ 28 ║ 3 ║ 4 ║
╚═══════╩════════════╩════════════╝
╔══════════════╦═══════════╦══════════╗
║ TakesClasses ║ ║ ║
╠══════════════╬═══════════╬══════════╣
║ id ║ person_id ║ class_id ║
║ 35 ║ 1 ║ 50 ║
║ 36 ║ 1 ║ 51 ║
║ 37 ║ 1 ║ 52 ║
║ 38 ║ 1 ║ 53 ║
║ 39 ║ 2 ║ 54 ║
║ 40 ║ 2 ║ 55 ║
║ 41 ║ 2 ║ 56 ║
╚══════════════╩═══════════╩══════════╝
After a long time trying different queries, the following query is the closest I got to the desired result:
select distinct name
from Persons P
where P.id NOT IN
(select person_id
from TakesClasses T join Knows K
on T.person_id = K.personA_id
where class_id IS NOT NULL)
I seem to get more results back than is necessary for this query (Harun, Egbert and John), but I cannot find the mistake I’m making. Can someone please help me out?
Advertisement
Answer
use this:
select P.id, name
from Persons P
where P.id NOT IN
(select K.personA_id
from TakeClasses T join Knows K
on T.person_id = K.personB_id
)