2011-07-06 28 views
10

試圖做到這一點(在SQL Server的工作原理):甲骨文DELETE語句與子查詢分解

WITH X AS(), Y AS(), Z AS() 
DELETE FROM TBL 
WHERE TBL.ID IN (SELECT ID FROM Z); 

此作品在甲骨文:

WITH X AS(), Y AS(), Z AS() 
SELECT * FROM TBL 
WHERE TBL.ID IN (SELECT ID FROM Z); 

但刪除並不:ORA-00928:缺少SELECT關鍵字

我的子查詢是相當大的,是否有不同的語法來使其工作?

回答

11

除了SELECT語句外,您不能使用子查詢因式分解/ CTE。 From the documentation:

您可以指定任何 頂級SELECT語句,並在大多數 類型的子查詢的這一條款。

你可以這樣做:

DELETE FROM tbl WHERE tbl.id IN 
(WITH X AS(), Y AS(), Z AS() 
SELECT id FROM TBL 
WHERE TBL.ID IN (SELECT ID FROM Z)); 
1

那麼,您至少需要以某種方式將所有別名查詢顯示在FROM語句中。我不知道是否有更多的問題,但這是必須的(我相信00928是你不這樣做的錯誤)。

+0

是啊,我注意到甲骨文贏得不要讓你留下一個未使用的子查詢,就像SQL Server一樣。 –

7

我得到了這個工作(我敢肯定,在SQL Server中不工作):

DELETE FROM TBL 
WHERE TBL.ID IN (
    WITH X AS(), Y AS(), Z AS() 
    SELECT ID FROM Z 
); 
+0

酷,從未嘗試過。 –