Search Postgresql Archives

Re: Expression alias not recognized in WHERE clause (ERROR: relation "p" does not exist)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Aug 9, 2012, at 7:32, Stefan Keller <sfkeller@xxxxxxxxx> wrote:

> Hi
> 
> I have two (hopefully) equivalent - and unfortunately very slow - queries which
> "Select all buildings that have >1 pharmacies and >1 schools within 1000m".
> 
> In the first query there is an expression alias "b" and in the second
> there are two expression aliases: "b" and "p".
> 
> Can someone tell me, why expression alias "p" is *not* recognized in
> the WHERE clause - whereas alias "b" is (parantheses missing)?

The subqueries can make use of values attached to the outer (aliased) relation but you cannot use the alias itself as a FROM source.  The error is stemming from your use of "FROM p" inside the WHERE.

> 
> And, has anyone an idea on how to reformulate this second query?

Use a common table expression (CTE) (sql command: WITH).  Those can be attached to any FROM clause in the query.

> 
> Stefan
> 
> 
> SELECT way AS building_geometry
> FROM
>  (SELECT osm_id, way
>   FROM osm_polygon
>   WHERE tags @> hstore('building','yes')
>  ) AS b
> WHERE
> (SELECT count(*) > 1 FROM osm_poi AS p
>  WHERE p.tags @> hstore('amenity','pharmacy')
>  AND ST_DWithin(b.way,p.way,1000)
> )
> AND
> (SELECT count(*) > 1 FROM osm_poi AS p
>  WHERE p.tags @> hstore('amenity','school')
>  AND ST_DWithin(b.way,p.way,1000)
> )
> 
> 
> SELECT b.way AS building_geometry
> FROM
> (SELECT way FROM osm_polygon
>  WHERE tags @> hstore('building','yes')
> ) AS b,
> (SELECT way, tags->'amenity' as value   FROM osm_poi
>  WHERE (tags ? 'amenity')
> ) AS p
> WHERE
> (SELECT count(*) > 1 FROM p
>  WHERE p.value = 'pharmacy'
>  AND ST_DWithin(b.way,p.way,1000)
> )
> AND
> (SELECT count(*) > 1 FROM p
>  WHERE p.value = 'school'
>  AND ST_DWithin(b.way,p.way,1000)
> )
> 
> ERROR:  relation "p" does not exist
> LINE 10:  (SELECT count(*) > 1 FROM p
>                                    ^
> 
> ********** Error **********
> 
> ERROR: relation "p" does not exist
> SQL state: 42P01
> Character: 245
> 
> -- 
> Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general

-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux