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