web-dev-qa-db-fra.com

Postgres "entrée de la clause FROM manquante" erreur lors d'une requête avec clause WITH

J'essaie d'utiliser cette requête dans Postgres 9.1.3:

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;

Je reçois cette erreur:

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

Je suis vraiment confus. La clause WITH semble correcte selon la documentation Postgres. Si je lance séparément la requête dans la clause WITH, j'obtiens des résultats corrects.

22
Aren Cambre

Du beau manuel :

Il existe deux manières de modifier une table à l'aide des informations contenues dans d'autres tables de la base de données: en utilisant des sous-sélections ou en spécifiant des tables supplémentaires dans la clause FROM.

Donc vous avez juste besoin d'une clause 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;

Le message d'erreur dit même autant:

ERREUR: entrée manquante de la clause FROM pour la table "arrête"

28
mu is too short

Cela peut également se produire si vous saisissez un nom de table avec une erreur. Par exemple:

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

Au lieu de profiles, j'ai utilisé incorrectement profile !! Cela fonctionnerait:

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