-- IN doesn't get correct results. -- That's because of how IN treats NULLs and the Three-valued logic -- NULL is treated as an unknown, so if there's a null in the t2.t1id -- NOT IN will return either NOT TRUE or NOT UNKNOWN. And neither can be TRUE. -- when there's a NULL in the t1id column of the t2 table the NOT IN query will always return an empty set. SELECT t1.* FROM t1 WHERE t1.id NOT IN (SELECT t1id FROM t2) -- NOT EXISTS gets correct results SELECT t1.* FROM t1 WHERE NOT EXISTS (SELECT * FROM t2 WHERE t1.id = t2.t1id) - Charles Nadeau