Re: Sv: how to build this query ??? Please help !!! - Mailing list pgsql-sql

From Jens Hartwig
Subject Re: Sv: how to build this query ??? Please help !!!
Date
Msg-id 3A545AF2.1C827233@debis.com
Whole thread Raw
In response to Re: Sv: how to build this query ??? Please help !!!  (Tod McQuillin <devin@spamcop.net>)
Responses Re: Sv: how to build this query ??? Please help !!!  (Tod McQuillin <devin@spamcop.net>)
Re: Sv: how to build this query ??? Please help !!!  ("Robert B. Easter" <reaster@comptechnews.com>)
List pgsql-sql
Hello Tom,

> [...]
> > SELECT a, (SELECT b)
> > FROM xyz;
> [...]
> I think it's OK (we're assuming that a and b are columns of xyz, right?)
> [...]

immediately after having sent my message I realized my fault: a and b
are not of the same table! Correctly, the statement had to be something
like:
 SELECT a, (SELECT b FROM z WHERE b = a) FROM x;

> [...]
> This is not really different from
>        SELECT x FROM xyz WHERE y IN
>                (SELECT a FROM abc WHERE b = xyz.z);
> [...]

Now it is :-) In a subquery, the inner query is only used for things
like comparison (as it is in your example). In my example the result
shows me two columns (in one record!!) which belong to different tables.
Mmmmh ... I tested the following:
 create table x (a numeric); create table y (b numeric);
 insert into x values (1); insert into x values (2);
 insert into y values (1); insert into y values (2);
 select a, (select b from y) from x;
 => ERROR:  More than one tuple returned by a subselect used as an
expression.

This is ok, anything else would have shocked me.
 select a, (select b from y where b = a) from x;
     a     | ?column? ----------+----------  1.000000 | 1.000000  2.000000 | 2.000000

This result made me understanding that this special case of "subqueries"
is possibly nothing more than a special form of joins between tables:
 select a, b  from x, y where x.a = y.b;

brings the same result. Now, back to the first example (of Nikolaj):
 SELECT a_nr,  (SELECT count(*) FROM cylinders WHERE z_a_nr = a_nr) AS #cylinder, (SELECT count(*) FROM cylinders WHERE
z_a_nr= a_nr AND z_status =
 
'zdr') AS #zdr, (SELECT count(*) FROM cylinders WHERE z_a_nr = a_nr AND z_status =
'zcu') AS #zcu, (SELECT count(*) FROM cylinders WHERE z_a_nr = a_nr AND z_status =
'zcr') AS #zcr, product, state FROM orders;

This would be a self-join of one table like:
 select ord.a_nr,         c1.count(*),         c2.count(*),         ... from   orders ord,         cylinders c1,
cylinders c2,         ... where c1.z_a_nr = ord.a_nr and c2.z_status = 'zdr' and ...
 

This in fact is not possible in PostgreSQL (it seems that the table
alias "c1" cannot be prefixed to the aggregate-function "count(*)") and
AFAIK in no other relational database. I really cannot imagine any
equivalent join-statement (or anything else like a subquery) which
brings the same results! Does this at all correlate with the philosophy
of a relational database?

Best regards, Jens

=============================================
Jens Hartwig
---------------------------------------------
debis Systemhaus GEI mbH
10875 Berlin
Tel.     : +49 (0)30 2554-3282
Fax      : +49 (0)30 2554-3187
Mobil    : +49 (0)170 167-2648
E-Mail   : jhartwig@debis.com
=============================================


pgsql-sql by date:

Previous
From: Tom Lane
Date:
Subject: Re: Sv: how to build this query ??? Please help !!!
Next
From: Kovacs Zoltan Sandor
Date:
Subject: Re: Support for arrays in PL/pgSQL