2012-03-10 11 views
22

Próbuję użyć tej kwerendy w PostgreSQL 9.1.3:Postgres "brakuje-klauzuli wejścia" błąd na zapytania z klauzuli 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; 

otrzymuję ten błąd:

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 Naprawdę jestem zdezorientowany. Klauzula WITH jest poprawna w dokumentacji Postgres. Jeśli osobno uruchomię zapytanie w klauzuli WITH, otrzymam poprawne wyniki.

+0

Ups! Dzięki. Chciałem powiedzieć, że próbowałem przemianować tabelę ** stopów ** jako krok diagnostyczny, ale to wyraźnie nie jest problem. –

Odpowiedz

28

Z 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.

więc wystarczy klauzuli 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; 

Komunikat o błędzie nawet mówi tyle:

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

+3

Masz rację! Muszą rozdawać punkty "kościotrup". Myślę, że właśnie na to zasłużyłem. –

+3

@ArenCambre: Myślę, że wszyscy mielibyśmy nadmiar punktów "kościotrup", gdyby coś takiego było.) Niektóre z najtrudniejszych problemów do zobaczenia są te tuż przed twoją twarzą. –

+2

Bardzo ładna odpowiedź. Tylko małe pytanie: powinien być FROM zatrzymania zamiast FROM stop, prawda? – joragupra

1

Może się również zdarzyć, jeśli błędnie wpisujesz nazwę tabeli. Na przykład:

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

Zamiast profiles i niewłaściwie stosowany profile !! To zadziała:

UPDATE profiles SET name = (profiles.first_name) WHERE id = 1 
Powiązane problemy