考慮和物體的以下 ERD Order:ItemArticle

我想洗掉Orders滿足一個復雜條件,然后洗掉Items那些關聯Orders,最后洗掉Articles那些關聯Items。
Orders從to級聯洗掉Items是可能的,Order就像Item. Item但是從to級聯洗掉Article是不可能的,因為Item它不是Article. 設定觸發器也不是一種選擇,因為通常我不想在洗掉Articlean 時Item洗掉 - 它應該只在此查詢的背景關系中發生。
我正在使用支持DELETE ... RETURNING陳述句的 PostgreSQL。不幸的是,結果不能像這樣嵌套:
DELETE FROM articles WHERE id IN
(DELETE FROM items WHERE order_id IN
(DELETE FROM orders WHERE complex_condition RETURNING id)
RETURNING article_id)
執行所有三個洗掉陳述句的最有效方法是什么?每張表包含幾千萬條記錄,complex_condition是最耗時的部分,所以我不希望執行多次。
我的一個想法是創建一個像這樣的臨時表:
CREATE TEMP TABLE id_of_order_to_be_deleted
AS
WITH cte1 AS (SELECT id FROM orders WHERE complex_condition)
SELECT *
FROM cte1;
然后用它來洗掉Orders和Items。這樣,complex_condition只評估一次。但我認為這是矯枉過正,應該有一個更簡單的解決方案。
uj5u.com熱心網友回復:
可以使用資料修改 CTE 嵌套結果:
with deleted_orders as (
DELETE FROM orders
WHERE complex_condition
RETURNING id
), deleted_items as (
DELETE FROM items
WHERE order_id IN (select id from deleted_orders)
returning article_id
)
DELETE FROM articles
WHERE id IN (select article_id from deleted_items);
您可能想嘗試where exists使用條件作為替代方案 - 有時這些比IN條件更快。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/492780.html
標籤:sql PostgreSQL 表现 公共表表达式
上一篇:postgreSQL:洗掉VARCHAR中的最后一個字符,直到找到匹配項
下一篇:計算兩行之間的百分比差異
