RE: [SQL] Using intersect in subquery
От | Hamid Khoshnevis |
---|---|
Тема | RE: [SQL] Using intersect in subquery |
Дата | |
Msg-id | 000b01beea89$d8d7e800$810a0a0a@local.dom обсуждение исходный текст |
Ответ на | Re: [SQL] Using intersect in subquery (Herouth Maoz <herouth@oumail.openu.ac.il>) |
Список | 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 по дате отправления: