Re: Getting matching and non-matching results (long)

From: Stephan Szabo <sszabo(at)megazone23(dot)bigpanda(dot)com>
To: Roberto Mello <rmello(at)cc(dot)usu(dot)edu>
Cc: <pgsql-sql(at)postgresql(dot)org>
Subject: Re: Getting matching and non-matching results (long)
Date: 2001-12-05 22:05:33
Message-ID: 20011205135740.J18043-100000@megazone23.bigpanda.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql


On Wed, 5 Dec 2001, Roberto Mello wrote:

> On Wed, Dec 05, 2001 at 01:07:20PM -0800, Stephan Szabo wrote:
> > >
> > > SELECT COUNT(incident_id), drug_name, grade_name
> > > FROM sds_offenders o, sds_drugs d, sds_drug_offenses do, sds_grades g
> > > WHERE o.drug_p = 't'
> > > AND o.offender_id = do.offender_id
> > > AND d.drug_id = do.drug_id
> > > GROUP BY drug_name, grade_name, d.sort_key
> > > ORDER BY d.sort_key
> >
> > I think you need a
> > g.gradeid=o.gradeid
> > in the where clause as well to constrain g to
> > the grade for which the offender belonged, right?
>
> Yes, I figured this mistake minutes after sending the message to the list.
> The problem is that with g.grade_id = o.grade_id there it gives me _only_
> the grades that have incidents in them, instead of _all_ the grades with
> 0's for those without incidents.

Right, then you will want an outer join, probably something like:
select count(incident_id), drug_name, grade_name
from
((sds_offenders o inner join sds_drug_offenses dro using (offender_id))
inner join sds_drugs d using (drug_id)) right join sds_grades using
(grade_id)
where o.drug_p='t'
group by drug_name, grade_name, d.sort_key
order by d.sort_key;

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message Christopher Kings-Lynne 2001-12-06 03:01:54 Select into
Previous Message Roberto Mello 2001-12-05 21:54:35 Re: Getting matching and non-matching results (long)