2015-09-19 15 views
5

Tôi đang tạo một hàm trong ngôn ngữ kịch bản lệnh pgsql, và những gì tôi muốn làm trong thời điểm này là lặp qua kết quả của truy vấn và cho mỗi hàng làm một cái gì đó cụ thể. Thử hiện tại của tôi là như sau, trong đó temprow được khai báo là temprow user_data.users%rowtype. Mã được đề cập đến là:PostgreSQL - Lặp lại kết quả truy vấn

FOR temprow IN 
     SELECT * FROM user_data.users ORDER BY user_seasonpts DESC LIMIT 10 
    LOOP 
     SELECT user_id,user_seasonpts INTO player_idd,season_ptss FROM temprow; 
     INSERT INTO user_data.leaderboards (season_num,player_id,season_pts) VALUES (old_seasonnum,player_idd,season_ptss); 
    END LOOP; 

Tuy nhiên, tôi nhận được lỗi sau từ đây: ERROR: relation "temprow" does not exist. Nếu nó rõ ràng những gì tôi muốn được thực hiện, bạn có thể chỉ cho tôi đúng cách để làm điều đó?

+2

Cách đúng để làm điều đó sẽ là: "dont't lặp". Những gì bạn có thể làm là hoàn toàn khả thi khi sử dụng SQL đơn giản: 'chèn vào bảng thành tích (a, b, c) chọn x, y, z từ người dùng; ' – wildplasser

+0

Như tôi thấy trong câu trả lời,' old_seasonnum' không được chọn tại điểm này từ 'user_data.users', nhưng ở điểm trước đó. –

+0

Nó được phép sử dụng hằng số (hoặc một biến, trong câu lệnh plpgsql hoặc trong các câu lệnh đã chuẩn bị) khi cần biểu thức: 'chèn vào foo (a, b, c) chọn 42, y, z từ thanh;' Ghi chú: trong mã của bạn 'old_seasonnum' thậm chí không được định nghĩa. – wildplasser

Trả lời

16

temprow là biến số bản ghi bị ràng buộc lần lượt theo từng bản ghi của SELECT đầu tiên.

Vì vậy, bạn nên viết:

FOR temprow IN 
     SELECT * FROM user_data.users ORDER BY user_seasonpts DESC LIMIT 10 
    LOOP 
     INSERT INTO user_data.leaderboards (season_num,player_id,season_pts) VALUES (old_seasonnum,temprow.userd_id,temprow.season_ptss); 
    END LOOP; 

Vòng lặp này có thể được đơn giản hóa hơn nữa như một truy vấn duy nhất:

INSERT INTO user_data.leaderboards (season_num,player_id,season_pts) 
SELECT old_seasonnum,player_idd,season_ptss FROM user_data.users ORDER BY user_seasonpts DESC LIMIT 10 
+0

Có phải 'FOR' /' temprow' là một con trỏ không? Nó có khóa không? – Ruslan

+1

Vâng, đó là con trỏ, nhưng không khóa được thực hiện trên bảng 'người dùng ' – Renzo

+0

Vấn đề với truy vấn đơn giản là' old_seasonnum' không được chọn từ bảng 'user_data.users', nhưng từ một lựa chọn trước đó và sẽ là được sử dụng tại thời điểm này. –

Các vấn đề liên quan