Re: subquery/alias question
От | Madison Kelly |
---|---|
Тема | Re: subquery/alias question |
Дата | |
Msg-id | 46FA5D94.6010806@alteeve.com обсуждение исходный текст |
Ответ на | Re: subquery/alias question (Gregory Stark <stark@enterprisedb.com>) |
Список | pgsql-general |
Gregory Stark wrote: > "Madison Kelly" <linux@alteeve.com> writes: > >> SELECT d.dom_id, d.dom_name FROM domains d WHERE (SELECT COUNT(*) FROM users u >> WHERE u.usr_dom_id=d.dom_id) > 0 ORDER BY d.dom_name ASC; >> >> Which gives me just the domains with at least one user under them, but not >> the count. This is not ideal, and I will have to come back to it next week. In >> the meantime, any idea what the GROUP BY error is? If not, I'll read through >> the docs on 'GROUP'ing once I get this deadline out of the way. > > I think you just want simply: > > SELECT dom_id, dom_name, count(*) > FROM users > JOIN domains ON (usr_dom_id=dom_id) > GROUP BY dom_id, dom_nmae > ORDER BY dom_name > > You don't actually need the HAVING (though it wouldn't do any harm either) > since only domains which match a user will come out of the join anyways. > > You can also write it using a subquery instead of a join > > SELECT * > FROM ( > SELECT dom_id, dom_name, > (SELECT count(*) FROM users WHERE user_dom_id = dom_id) as nusers > FROM domains > ) as subq > WHERE nusers > 0 > ORDER BY dom_name > > But that will perform worse in many cases. > You are right, the 'HAVING' clause does seem to be redundant. I removed it and ran several 'EXPLAIN ANALYZE's on it with and without the 'HAVING' clause and found no perceivable difference. I removed the 'HAVING' clause anyway, since I like to keep queries as minimal as possible. Thank you! Madi
В списке pgsql-general по дате отправления: