Opdatering:
LATERAL
joins tillader det og blev introduceret med Postgres 9.3. Detaljer:
Årsagen er i fejlmeddelelsen. Et element i FROM
listen kan ikke henvise til et andet element i FROM
liste på samme niveau. Det er ikke synligt for en peer på samme niveau. Du kan løse dette med en korreleret underforespørgsel :
SELECT *, (SELECT t FROM rp ORDER BY abs(rp.t - rq.t) LIMIT 1) AS raFROM rq
Du er selvfølgelig ligeglad med hvilken række fra RP
du vælger fra et sæt lige tætte rækker, så jeg gør det samme.
Dog et underforespørgselsudtryk i SELECT
listen kan kun returnere én kolonne. Hvis du ønsker mere end én eller alle kolonner fra tabellen RP
, brug noget som denne underforespørgselskonstruktion:
Jeg antager, at der findes en primær nøgle id
i begge tabeller.
SELECT id, t, (ra).*FROM ( SELECT *, (SELECT rp FROM rp ORDER BY abs(rp.t - rq.t) LIMIT 1) AS ra FROM rq ) x;
Korrelerede underforespørgsler er berygtede for dårlig ydeevne . Denne form for forespørgsel - mens du åbenbart beregner, hvad du vil have - vil sutte især fordi udtrykket rp.t - rq.t
kan ikke bruge et indeks. Ydeevnen forringes drastisk med større borde.
Denne omskrevne forespørgsel burde kunne bruge et indeks på RP.t
, som burde yde meget hurtigere med store borde .
MED x AS ( VÆLG * ,(VÆLG t FRA rp HVOR rp.t =rq .t ORDER BY rp.t LIMIT 1) AS t_post FROM rq )SELECT id, t ,CASE WHEN (t_post - t) <(t - t_pre) THEN t_post ELSE COALESCE(t_pre, t_post) END AS raFROM x;
Igen, hvis du vil have hele rækken:
MED x AS ( VÆLG * ,(VÆLG rp FRA rp HVOR rp.t =rq .t ORDER BY rp.t LIMIT 1) AS t_post FROM rq ), y AS ( SELECT id, t ,CASE WHEN ((t_post).t - t) <(t - (t_pre).t) THEN t_post ELSE COALESCE( t_pre, t_post) END AS ra FROM x )SELECT id AS rq_id, t AS rq_t, (ra).*FROM y BESTILLING AF 2;
Bemærk brugen af parenteser med sammensatte typer ! Ingen forældre er overflødige her. Mere om det i manualen her og her .
Testet med PostgreSQL 9.1. Demo på sqlfiddle.