RE: [SQL] Using intersect in subquery - Mailing list pgsql-sql

From Hamid Khoshnevis
Subject RE: [SQL] Using intersect in subquery
Date
Msg-id 000b01beea89$d8d7e800$810a0a0a@local.dom
Whole thread Raw
In response to Re: [SQL] Using intersect in subquery  (Herouth Maoz <herouth@oumail.openu.ac.il>)
List 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@oumail.openu.ac.il]
> Sent: Wednesday, August 18, 1999 7:22 AM
> To: Hamid Khoshnevis; pgsql-sql@postgreSQL.org
> Subject: Re: [SQL] Using intersect in subquery
>
>
> At 16:51 +0300 on 18/08/1999, Tom Lane wrote:
>
>
> > Bruce Momjian <maillist@candle.pha.pa.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
>
>



pgsql-sql by date:

Previous
From: "Mike Field"
Date:
Subject: multiple keyword search
Next
From: wieck@debis.com (Jan Wieck)
Date:
Subject: Re: [SQL] does LIMIT save time?