2012-03-10 28 views
22

Tôi cố gắng để sử dụng truy vấn này trong Postgres 9.1.3:Postgres "thiếu entry FROM-khoản" lỗi trên truy vấn với mệnh đề 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; 

tôi nhận được lỗi này:

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 

tôi 'thực sự bối rối. Mệnh đề WITH xuất hiện đúng cho mỗi tài liệu Postgres. Nếu tôi chạy riêng truy vấn trong mệnh đề WITH, tôi nhận được kết quả chính xác.

+0

Rất tiếc! Cảm ơn. Tôi sẽ nói rằng tôi đã thử đổi tên bảng ** stop ** thành bước chẩn đoán, nhưng rõ ràng không phải là vấn đề. –

Trả lời

28

Từ 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.

Vì vậy, bạn chỉ cần một mệnh đề 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; 

Thông báo lỗi thậm chí còn nói càng nhiều:

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

+3

Bạn nói đúng! Họ cần phải đưa ra những điểm "xương đầu" ở đây. Tôi nghĩ rằng tôi chỉ kiếm được một. –

+3

@ArenCambre: Tôi nghĩ rằng tất cả chúng ta đều có một điểm "xương đầu" vượt trội nếu có một điều như vậy :) Một số vấn đề khó khăn nhất để xem là những điểm ngay trước mặt bạn. –

+2

Câu trả lời rất hay. Chỉ là một câu hỏi nhỏ: nó phải là FROM dừng thay vì FROM dừng lại, phải không? – joragupra

1

này cũng có thể xảy ra nếu bạn nhập nhầm tên bảng. Ví dụ:

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

Thay vì sử dụng sai profile !! Điều này sẽ hoạt động:

UPDATE profiles SET name = (profiles.first_name) WHERE id = 1 
Các vấn đề liên quan