SQL 텍스트가 매개 변수로 필요한 C 함수와 함께 사용되는 명령문이있는 PostgreSQL
-
20-12-2019 - |
문제
PostgreSQL에서 문을 사용하여 다음 쿼리를 만들려고합니다.
WITH catchment AS (
SELECT * FROM .. -- Some time consuming join statement
),
catchment10 AS (
SELECT * FROM pgr_pointsaspolygon('SELECT * FROM catchment where cost < 10000')
),
catchment20 AS (
SELECT * FROM pgr_pointsaspolygon('SELECT * FROM catchment where cost < 20000')
),
catchment30 AS (
SELECT * FROM pgr_pointsaspolygon('SELECT * FROM catchment where cost < 30000')
)
SELECT * FROM catchment10
UNION
SELECT * FROM catchment20
UNION
SELECT * FROM catchment30
.
PGR_PIR_PIRPOINTSASPLYGON () 함수는 PGR_ALPHASHAPE () 함수를 호출한다는 것입니다.
CREATE OR REPLACE FUNCTION pgr_alphashape(IN sql text, OUT x double precision, OUT y double precision)
RETURNS SETOF record AS
'$libdir/librouting_dd', 'alphashape'
LANGUAGE c IMMUTABLE STRICT
COST 1
ROWS 1000;
ALTER FUNCTION pgr_alphashape(text)
OWNER TO postgres;
.
pgr_alphashape는 작동하도록 SQL 문이 필요하지만 WITH 절에서 인수 테이블을 전달할 때 다음 오류가 발생합니다.
ERROR: relation "catchment" does not exist
.
이 오류를 수정하여 집수 테이블이 3 번 계산되지 않고 pgr_pointsaspolygon 함수로 전달할 수 있도록이 오류를 수정하는 다른 방법이 있습니까?
해결책
타사에서 제공하는 기능으로 분명히 작동하기 때문에 유일한 옵션은 임시 테이블입니다. relinsetodicetagcode CREATE TABLE AS
를 사용하여 여러 호출과의 충돌을 피하기 위해세션.
BEGIN;
CREATE TEMP TABLE catchment ON COMMIT DROP AS
SELECT * FROM .. -- Some time consuming join statement
;
SELECT * FROM pgr_pointsaspolygon('SELECT * FROM catchment WHERE cost < 10000')
UNION ALL -- Presuming we do not want to eliminate dupes?
SELECT * FROM pgr_pointsaspolygon('SELECT * FROM catchment WHERE cost < 20000')
UNION ALL
SELECT * FROM pgr_pointsaspolygon('SELECT * FROM catchment WHERE cost < 30000')
COMMIT;
. 제휴하지 않습니다 StackOverflow