2014-01-14 78 views
0

這是怎麼回事?基本上,這個過程會更新主買方表中的列以檢查用戶是否有其他表中的數據。在postgres中使用for循環和if語句

DO language plpgsql $$ 
    DECLARE 
    buyer integer; 
    BEGIN 
    FOR buyer IN SELECT id FROM buyers 
    LOOP 
     IF (SELECT count(*) FROM invoice WHERE buyer_id = buyer) > 0 THEN 
     UPDATE buyers SET has_invoice = true WHERE id = buyer; 
     ELSE 
     UPDATE buyers SET has_invoice = false WHERE id = buyer; 
     END IF; 
    END LOOP; 
    RETURN; 
    END; 
$$; 
+2

你不需要循環,這可以用一個更新語句(更有效率)完成。 –

+0

另外,如果您在另一個連接更新「invoice」表時運行此操作,則可能會產生錯誤的結果。您需要考慮併發性,或者採取表鎖,以便您可以忽略它。 –

回答

1

目前尚不清楚什麼是「不工作」。無論哪種方式,使用該等效UPDATE語句來代替:

UPDATE buyers b 
SET has_invoice = EXISTS (SELECT 1 id FROM invoice WHERE buyer_id = b.id); 

如果不需要冗餘存儲的性能,你可以使用一個VIEW生成列爲了同樣的目的。然後,欄位has_invoice即時計算並始終保持最新狀態。在這個密切相關的答案中的說明:
Store common query as column?