RE: [SQL] Using intersect in subquery

From: "Hamid Khoshnevis" <hamid(at)emarq(dot)com>
To: <pgsql-sql(at)postgreSQL(dot)org>
Subject: RE: [SQL] Using intersect in subquery
Date: 1999-08-19 21:28:58
Message-ID: 000b01beea89$d8d7e800$810a0a0a@local.dom
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

I re-implemented the intersect using sub-selects. It worked fine. Then I
tried Herouth's solution of:

SELECT * FROM Table1
WHERE KeyField in
( SELECT Keyfield2
FROM Table2, Table3
WHERE Keyfield2 = Keyfield3
);

This one is blazingly fast (by a factor of 4) compared to sub-select. Moral
of the story IMHO: Use flat select with a lot of joins vs. intersects or
sub-selects to get fast response (anyone?).

hamid

> -----Original Message-----
> From: Herouth Maoz [mailto:herouth(at)oumail(dot)openu(dot)ac(dot)il]
> Sent: Wednesday, August 18, 1999 7:22 AM
> To: Hamid Khoshnevis; pgsql-sql(at)postgreSQL(dot)org
> Subject: Re: [SQL] Using intersect in subquery
>
>
> At 16:51 +0300 on 18/08/1999, Tom Lane wrote:
>
>
> > Bruce Momjian <maillist(at)candle(dot)pha(dot)pa(dot)us> writes:
> > > Try 6.5. We fixed some Intersect stuff.
> > >>
> > >> select * from Table1
> > >> where KeyField1 in
> > >> (select KeyField2 from Table2 where somecondition
> > >> intersect
> > >> select KeyField3 from Table3 where somecondition);
> > >>
> > >> (I believe) I am running PG 6.4. The INTERSECT by itself works, but
> >not in
> > >> a subquery.
> > >>
> >
> > No, it still won't work --- the current grammar specifies SubSelect not
> > select_clause as the kind of select you can put inside an expression.
> > Not sure what it would take to fix this; I have a feeling that just
> > changing the grammar wouldn't be good enough :-(. Better add it to the
> > TODO list:
> > * Support UNION/INTERSECT/EXCEPT in sub-selects
>
> In the meantime I suppose changing the query might work. Intersect should
> return only the rows which are returned from both tables, but since we are
> talking about only one field here, it may be convenient to just do an
> internal join?
>
> SELECT * FROM Table1
> WHERE KeyField in
> ( SELECT Keyfield2
> FROM Table2, Table3
> WHERE Keyfield2 = Keyfield3
> );
>
> This is not equivalent in the case of a NULL, but in all other cases, I
> believe it is.
>
> Or maybe the following is more efficient (and clear?):
>
> SELECT * FROM Table1
> WHERE EXISTS
> ( SELECT *
> FROM Table2
> WHERE KeyField2 = KeyField
> )
> AND EXISTS
> ( SELECT *
> FROM Table3
> WHERE KeyField3 = KeyField
> );
>
> Herouth
>
> --
> Herouth Maoz, Internet developer.
> Open University of Israel - Telem project
> http://telem.openu.ac.il/~herutma
>
>

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message Esteban Chiner Sanz 1999-08-20 06:47:03 Re: [SQL] What JDBC datatype can be used for DATETIME ?
Previous Message Jan Wieck 1999-08-19 21:24:09 Re: [SQL] does LIMIT save time?