Thread: Join Statements

Join Statements

From
tconti@hotmail.com (T Conti)
Date:
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


Re: Join Statements

From
"Henshall, Stuart - WCP"
Date:

> -----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