Re: Query for filtering records
От | Joel Burton |
---|---|
Тема | Re: Query for filtering records |
Дата | |
Msg-id | 20021203194728.GA917@temp.joelburton.com обсуждение исходный текст |
Ответ на | Query for filtering records (eric soroos <eric-psql@soroos.net>) |
Ответы |
Re: Query for filtering records
|
Список | pgsql-sql |
On Tue, Dec 03, 2002 at 11:01:33AM -0800, eric soroos wrote: > I'm having trouble subtracting groups from other groups. > > > I've got a data model that has the following essential features: > > create table contacts (num int, properties....); > create table groups (groupNum int, contactNum int); > > Where not all contacts will be in a group, some groups will contain most contacts, and there will be something like hundredsof groups and tens of thousands of contacts. I allow people to build groups using criteria, which I need to programaticallytranslate to sql. > > One somewhat common pattern is: > > Select all contacts in group a, who have property b, and who aren't in groups c,d,e,f... > > My first shot was subqueries: > > select num, p1,p2 ... from contacts > inner join groups using (contacts.num=groups.contactNum) > where groups.groupNum=a > and contact.p3=b > and not num in (select contactNum from groups where groupNum=c) > and not num in (select contactNum from groups where groupNum=d) > and not num in (select contactNum from groups where groupNum=e) > and not num in (select contactNum from groups where groupNum=f) > > This is .... slow. agonizingly so. I'd say so! Something like: SELECT * ...FROM ...WHERE NOT IN (SELECT contactnum FROM groups WHERE groupnum='c' orgroupnum='d' OR ... ) is bound to be _much_ faster! And even better is SELECT *FROM ... contacts c1WHERE NOT EXISTS (SELECT * FROM groups WHERE groupname='c' orgroupnum='d' or groupnume='e' ...AND groups.contactnum=c1.contactnum) EXISTS is almost always faster in PG. -- Joel BURTON | joel@joelburton.com | joelburton.com | aim: wjoelburton Independent Knowledge Management Consultant
В списке pgsql-sql по дате отправления: