Re: Join Statements - Mailing list pgsql-sql

From Henshall, Stuart - WCP
Subject Re: Join Statements
Date
Msg-id E2870D8CE1CCD311BAF50008C71EDE8E01F747EB@MAIL_EXCHANGE
Whole thread Raw
In response to Join Statements  (tconti@hotmail.com (T Conti))
List pgsql-sql

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


pgsql-sql by date:

Previous
From: Luis Sousa
Date:
Subject: Re: SELECT with LEFT OUTER JOIN ON
Next
From: Tom Lane
Date:
Subject: Re: Transient Disk Usage Higher In 7.2 ?