From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | juerg(dot)rietmann(at)pup(dot)ch |
Cc: | pgsql-sql(at)postgresql(dot)org |
Subject: | Re: how to do this join ? |
Date: | 2001-04-06 14:46:13 |
Message-ID: | 25386.986568373@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
juerg(dot)rietmann(at)pup(dot)ch writes:
> select *,
> (select a_typ from auftrag where a_nr=z_a_nr) as typ,
> (select a_t_definition_d from auftrags_typ where a_t_code=typ) as text
> from zylinder
Seems like a very non-SQLish way to proceed. Instead use joins:
select zylinder.*, a_typ as typ, a_t_definition_d as text
from zylinder, auftrag, auftrags_typ
where a_nr = z_a_nr and a_t_code = a_typ
If there were multiple matches in auftrag or auftrags_typ then this
would yield multiple rows per zylinder row, which you might not want;
but your subselect-based approach is already assuming there are not
multiple matches.
If there's a possibility of *no* matching row, then the first solution
would emit NULLs for the missing auftrag and auftrag_typ values, whereas
the second would emit nothing at all for that zylinder row. If that's
not what you want, you need to use outer joins (new in 7.1):
select zylinder.*, a_typ as typ, a_t_definition_d as text
from (zylinder left join auftrag on (a_nr = z_a_nr))
left join auftrags_typ on (a_t_code = a_typ);
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | Peter Eisentraut | 2001-04-06 14:51:39 | Re: how to do this join ? |
Previous Message | The Hermit Hacker | 2001-04-06 14:34:33 | Re: 7.1 out soon? |