![](/img/trans.png)
[英]Postgresql: An alternative to subqueries to make the query more efficient?
[英]Postgresql: How to make the following query more efficient
我有一個過程,其中我必須檢查某個視圖中是否有某些指定的條目,並相應地刪除它們。 為此,我使用了以下方法-
SELECT id_1,
id_2,
id_3,
id_4
INTO v_id_1,
v_id_2,
v_id_3,
v_id_4
FROM v_doc
WHERE parent_id_1 = p_id_1 -- 'p_' suffix stands for function parameters
AND parent_id_2 = p_id_2
AND parent_id_3 = p_id_3
LIMIT 1
;
WHILE v_id_1 IS NOT NULL
LOOP
-- Code for child document line deletion goes here
SELECT id_1,
id_2,
id_3,
id_4
INTO v_id_1,
v_id_2,
v_id_3,
v_id_4
FROM v_doc
WHERE parent_id_1 = p_id_1
AND parent_id_2 = p_id_2
AND parent_id_3 = p_id_3
LIMIT 1
;
END LOOP;
這是有效的方法,還是有一種更有效的方法來進行這種類型的查詢? 當然,我在談論我選擇記錄的方式。
我想您想知道如果查詢返回很多行,如何刪除每個匹配項。 一種更快且更正確的方法是運行一次查詢,然后遍歷其行:
DECLARE
r RECORD;
BEGIN
FOR r IN SELECT id_1, id_2, id_3, id_4
FROM v_doc
WHERE id_1 = p_id_1
AND id_2 = p_id_2
AND id_3 = p_id_3 LOOP
-- delete item for r.id_1, r.id_2, etc.
END LOOP;
END;
參見http://www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING
如果可能的話,一個更好的方法可能是簡單地使用DELETE FROM x WHERE ...
語句。 這取決於刪除的簡單程度。
我有什么想念的嗎?
DELETE FROM v_doc
WHERE EXISTS(SELECT NULL
FROM v_doc x
WHERE x.id_1 = v_doc.id_1
AND x.id_2 = v_doc.id_2
AND x.id_3 = v_doc.id_3
AND x.id_4 = v_doc.id_4
AND x.parent_id_1 = p_id_1
AND x.parent_id_2 = p_id_2
AND x.parent_id_3 = p_id_3)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.