From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | Mike Mascari <mascarm(at)mascari(dot)com> |
Cc: | PostgreSQL <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: HAVING and column alias |
Date: | 2003-02-22 03:39:46 |
Message-ID: | 2493.1045885186@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Mike Mascari <mascarm(at)mascari(dot)com> writes:
> SELECT
> SUM(p.qty),
> (SELECT date_trunc('day', sales.active)
> FROM sales
> WHERE sales.purchase = p.purchase) AS field1
> FROM purchases p
> GROUP BY field1
> HAVING (field1 IS NOT NULL);
> ERROR: Attribute 'field1' not found
This is definitely illegal per the SQL spec: output column names are not
legal per spec in either GROUP BY or HAVING. Postgres is lax about this
in GROUP BY (mainly for historical reasons), but not in HAVING --- and
even in GROUP BY, we only recognize an output column name if it is used
by itself, not as part of an expression. So your HAVING clause would
lose even if we applied GROUP-BY-like rules to it.
If you can't restructure the query, I think you'll have to repeat the
sub-SELECT in the HAVING clause rather than refer to it via the field1
alias. If you can restructure, consider
SELECT * FROM
(SELECT
SUM(p.qty),
(SELECT date_trunc('day', sales.active)
FROM sales
WHERE sales.purchase = p.purchase) AS field1
FROM purchases p
GROUP BY field1) ss
WHERE (field1 IS NOT NULL);
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | Egyud Csaba | 2003-02-22 04:43:40 | Re: How to get the IP address of the connecetd user |
Previous Message | Christopher Browne | 2003-02-22 03:05:46 | Re: What filesystem? |