2017-03-07 137 views
0

返回DELETE的基本語法是PostgreSQL的:刪除行子查詢

DELETE FROM table 
WHERE condition 

是否有使用子查詢/別名在DELETE聲明,像下面一個簡單的方法?

DELETE FROM (subquery) as sub 
WHERE condition 

下面是一個最小的工作臺和我的失敗嘗試使用子查詢/別名:

---create table 
create table orderT (
    id integer PRIMARY KEY, 
    country_code varchar(2), 
    created_date date, 
    closed_date date); 

---populate table 
INSERT INTO orderT VALUES (1, 'US', now(), now() + interval '1 day' * 21); 
INSERT INTO orderT VALUES (2, 'CA', now(), now() + interval '1 day' * 35); 

--This does not work  
    DELETE 
    FROM 
     (SELECT * 
     FROM orderT) AS sub 
    WHERE sub.id = 1; 

你可以嘗試代碼here

的PostgreSQL 9.5

+0

'......在我的實際腳本中,子查詢長度超過90行。「我的行數超過300行! - >>請不要在令人印象深刻的數字背後隱藏你的無知。 – wildplasser

回答

2

不,你不能直接這樣做。原因是子查詢可以從多個行源構建,包括表,視圖,子句,其他子查詢(由......構成),設置返回函數......可以想象,規劃師可以跟蹤所有表中的所有受影響的行,但它並未實現,太複雜。

可以,但是,構造從表中刪除的包含在子查詢中的所有行的序列,像這樣:

WITH complex_sub_query AS (
    SELECT Aid, Bid, Cid, many_more_columns 
    FROM tableA 
    JOIN tableB ON ... 
    JOIN tableC ON ... 
    ... 
    WHERE complex_condition 
), first_delete AS (
    DELETE FROM tableC WHERE id IN (SELECT Cid FROM complex_sub_query) 
), second_delete AS (
    DELETE FROM tableB WHERE id IN (SELECT Bid FROM complex_sub_query) 
) 
DELETE FROM tableA WHERE id IN (SELECT Aid FROM complex_sub_query); 

complex_sub_query物化這樣的行,其中包括表的主鍵您想要刪除,可用於以下每個DELETE報表。由於刪除順序通常與外鍵相關,因此需要通過其他約束和級聯刪除來仔細分析數據模型,以正確的順序執行操作。