sql >> Database teknologi >  >> RDS >> PostgreSQL

FEJL:underforespørgsel i FROM kan ikke henvise til andre relationer på samme forespørgselsniveau

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.



  1. Brug af IF ELSE-sætning baseret på Count til at udføre forskellige Insert-sætninger

  2. Hvordan tilføjer man i hvert link (a href) tag en rel-attribut ved hjælp af php?

  3. mysql datetime sammenligning

  4. Sådan samler du forskellige værdier fra flere lister ved hjælp af Oracle JSON_OBJECT &JSON_ARRAYAGG