2012-09-15 42 views

回答

2

您可以使用EXECUTE BLOCK順序掃描詳細表並刪除沒有主記錄匹配的記錄。

EXECUTE BLOCK 
AS 
    DECLARE VARIABLE C CURSOR FOR 
    (SELECT d.id 
    FROM detail d LEFT JOIN master m 
     ON d.master_id = m.id 
    WHERE m.id IS NULL); 
    DECLARE VARIABLE I INTEGER; 
BEGIN 
    OPEN C; 
    WHILE (1 = 1) DO 
    BEGIN 
    FETCH C INTO :I; 
    IF(ROW_COUNT = 0)THEN 
     LEAVE; 
    DELETE FROM detail WHERE id = :I; 
    END 
    CLOSE C; 
END 
3

(NOT) IN通常可以通過使用(NOT) EXISTS來代替優化。

DELETE 
FROM SLAVE_TABLE 
WHERE NOT EXISTS (SELECT 1 FROM MASTER_TABLE M WHERE M.ITEM_ID = ITEM_ID) 

我不知道你正在嘗試做的,但對我這個查詢表明您應該使用外鍵來執行這些類型的限制,無法運行查詢,清理殘局之後。

+0

具有ON DELETE CASCADE規則的外鍵將自動執行作業。 –

+0

當然,外鍵是最優的,但不幸的是,在這種情況下它太晚了。 – Harriv

+0

好吧,但是在你運行這個查詢之後,確保你添加了這樣一個約束(例如,按照Andrei建議的ON DELETE CASCADE)。 –