2012-03-10 13 views
22

Estoy tratando de utilizar esta consulta en Postgres 9.1.3:Postgres "faltantes entrada cláusula FROM" error en consulta con la cláusula WITH

WITH stops AS (
    SELECT citation_id, 
      rank() OVER (ORDER BY offense_timestamp, 
        defendant_dl, 
        offense_street_number, 
        offense_street_name) AS stop 
    FROM consistent.master 
    WHERE citing_jurisdiction=1 
) 

UPDATE consistent.master 
SET arrest_id = stops.stop 
WHERE citing_jurisdiction=1 
    AND stops.citation_id = consistent.master.citation_id; 

me sale este error:

ERROR: missing FROM-clause entry for table "stops" 
LINE 12: SET arrest_id = stops.stop 
         ^

********** Error ********** 

ERROR: missing FROM-clause entry for table "stops" 
SQL state: 42P01 
Character: 280 

I estoy realmente confundido La cláusula WITH aparece correcta según la documentación de Postgres. Si ejecuto la consulta por separado en la cláusula WITH, obtengo los resultados correctos.

+0

¡Vaya! Gracias. Iba a decir que intenté renombrar la tabla ** stops ** como un paso de diagnóstico, pero claramente ese no es el problema. –

Respuesta

28

Desde el fine manual:

There are two ways to modify a table using information contained in other tables in the database: using sub-selects, or specifying additional tables in the FROM clause.

Por lo que sólo necesita una cláusula FROM:

WITH stops AS (
    -- ... 
) 
UPDATE consistent.master 
SET arrest_id = stops.stop 
FROM stops -- <----------------------------- You missed this 
WHERE citing_jurisdiction=1 
    AND stops.citation_id = consistent.master.citation_id; 

El mensaje de error incluso dice tanto:

ERROR: missing FROM-clause entry for table "stops"

+3

¡Tienes razón! Necesitan dar puntos "bonehead" aquí. Creo que acabo de ganar uno. –

+3

@ArenCambre: Creo que todos tendríamos un exceso de puntos de "cabeza hueca" si hubiera tal cosa :) Algunos de los problemas más difíciles de ver son los que están justo frente a su cara. –

+2

Muy buena respuesta. Solo una pequeña pregunta: debería ser FROM stop en lugar de FROM stop, ¿verdad? – joragupra

1

Esto también puede suceder si usted escribe mal un nombre de tabla. Por ejemplo:

UPDATE profiles SET name = (profile.first_name) WHERE id = 1 

En lugar de profiles i utiliza incorrectamente profile !! Esto funcionaría:

UPDATE profiles SET name = (profiles.first_name) WHERE id = 1 
Cuestiones relacionadas