Thread: how to do this join ?

how to do this join ?

From
juerg.rietmann@pup.ch
Date:
Hello there

I have another SQL question. Please see the example :

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

I have three tables that I need data from. I'd like to use the <as typ> to
temporary store the kind of auftrag and then use it to get the
definition (clear text) from another table.

The query returns that typ is not known .

How can I do it ?

Thanks ... jr
============================================
PFISTER + PARTNER, SYSTEM - ENGINEERING AG
Juerg Rietmann
Grundstrasse 22a
6343 Rotkreuz
Switzerland

phone: +4141 790 4040
fax: +4141 790 2545
mobile: +4179 211 0315
============================================



Re: how to do this join ?

From
Peter Eisentraut
Date:
juerg.rietmann@pup.ch writes:

> Hello there
>
> I have another SQL question. Please see the example :
>
> 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

select zylinder.*, auftrag.a_typ (select a_t_definition_d from auftrags_typ where a_t_code = auftrag.a_typ)
from zylinder, auftrag
where auftrag.a_nr = zylinder.z_a_nr;

or, using 7.1, maybe something like

select zylinder.*, auftrag.a_typ, auftrags_typ.a_t_definition
from (zylinder join auftrag on a_nr = z_a_nr) left join auftrags_typ on a_t_code = a_typ

Other variations are possible, depending on the referential contraints you
have between the tables.

>
> I have three tables that I need data from. I'd like to use the <as typ> to
> temporary store the kind of auftrag and then use it to get the
> definition (clear text) from another table.
>
> The query returns that typ is not known .

-- 
Peter Eisentraut      peter_e@gmx.net       http://yi.org/peter-e/



Re: how to do this join ?

From
Tom Lane
Date:
juerg.rietmann@pup.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