> -----Original Message-----
> From: tconti@hotmail.com [mailto:tconti@hotmail.com]
> Sent: 11 February 2002 15:16
>
>
> Howdy:
>
> I need to put together an SQL statement that will return all of the
> rows in table A that are not in table B. Table A and B have the same
> primary key. For example:
>
> select count(a.*)
> from a (nolock) left outer join
> b (nolock) on a.id = b.id
> where a.id != b.id
>
> This did not work. It returned 0 rows. I know that this could be
> done very easily in a sub-select, but that seems inefficient. Is
> there any way to accomplish what I mentioned above in the join
> statement or is the sub-select the way to go?
>
> Thanks for the help,
> Tom
>
This shouldn't be too inefficient:
select * from a where NOT EXISTS (SELECT * FROM b WHERE b.id=a.id)
Note the use of EXISTS rather than IN (IN isn't efficient on PostgreSQL)
If you wanted to use a join I think this is what you actually want:
SELECT * FROM a LEFT JOIN b ON a.id=b.id WHERE b.id IS NULL;
The reason a.id<>b.id doesn't work is because NULL is an unknown value, and
therefore might equal a if it was known.
Give it a test and tell me which works better (I'd expect them to be about
the same).
Cheers,
- Stuart