Re: [GENERAL] Re: sql question
От | Herbert Liechti |
---|---|
Тема | Re: [GENERAL] Re: sql question |
Дата | |
Msg-id | 38346B06.61F74C93@thinx.ch обсуждение исходный текст |
Ответ на | Re: sql question (Ed Loehr <ELOEHR@austin.rr.com>) |
Список | pgsql-general |
Ed Loehr wrote: > > From: Herbert Liechti <Herbert.Liechti@thinx.ch> > > Subject: sql question > > > > I have a sql problem which I can't solve. The following table is defined > > > > create table AdressGroup > > ( > > AdrGroup_Id INTEGER NOT NULL > > DEFAULT NEXTVAL('adrverw_id_seq'), > > Zeit DATETIME NOT NULL, > > Group_Id INTEGER NOT NULL, > > Adress_Id INTEGER NOT NULL > > ); > > > > The table assigns adresses to adressgroups. > > > > I'd like to select the adresses which belongs to one specific adressGroup and to no other group. If an adress has morethan one entry in the AdressGroup > > table it should not be in the projection. > > > > I tried the following: > > > > SELECT * FROM adressGroup > > WHERE Group_Id = 6 > > AND EXISTS( SELECT AdrGroup_Id FROM adressGroup ag_alias > > WHERE adressGroup.AdrGroup_Id = ag_alias.AdrGroup_Id > > GROUP BY AdrGroup_Id HAVING COUNT(*) = 1 ); > > > > When I do this I get the following error: > > ERROR: rewrite: aggregate column of view must be at rigth side in qual > > ERROR: rewrite: aggregate column of view must be at rigth side in qual > > > > Does anybody knows the solution? Thanks > > > > Not sure about the error above, other than the apparent typos with "adressGroup", but I think you can get what you're afterwith this: > > SELECT * > FROM AdressGroup ag > WHERE ag.Group_Id = 6 AND NOT EXISTS ( > SELECT AdrGroup_Id > FROM AddressGroup ag2 > WHERE ag2.AdrGroup_Id = ag.AdrGroup_Id AND ag2.Group_Id <> 6); The query does not produce the estimated result :-/( It returns all records from adressgroup 6. It seems that the problem can not be solved in a single sql-statement. I assume that the above statement joins the table with the alias table with the subset of adress group 6. Probably I do it with a temporary table: Create temp table tempGroup(adrGroup_id integer, groupcounter integer); INSERT INTO tempGroup SELECT adrGroup_Id, count(*) FROM adrGroup GROUP BY 1 HAVING COUNT(*) = 1); SELECT * from adrGroup, tempGroup WHERE adrGroup.adrGroup_id = tempGroup.adrGroup_id AND adrGroup.group_id = 7; This is working but without the desired performance :-( Thanks anyway Herbie -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Herbert Liechti E-Mail: Herbert.Liechti@thinx.ch ThinX networked business services Stahlrain 10, CH-5200 Brugg ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
В списке pgsql-general по дате отправления: