2013-08-19 51 views
-1

刪除重複行後的邏輯是什麼? 我知道這是用於刪除重複行的查詢。刪除重複行後的邏輯?

delete from tvsemp e where rowid>(select min(rowid) from tvsemp m where e.ename=m.ename); 

這裏的時候,我分子查詢即第一select min(m.rowid) from tvsemp e, tvsemp m where e.ename=m.ename; 然後我得到的結果的ROWID是

MIN(M.ROWID) 
___________________ 
AAAEDUAABAAAKiqAAP 

然後外部查詢select ename from tvsemp emp where rowid>'AAAEDUAABAAAKiqAAP' 但對於這個我得到N-1的結果(除了我用'>'sin消除的那個)

我的疑問是如果這兩個結合我得到確切的表沒有重複這是爲什麼?

回答

3

你問是否第一個查詢會起作用嗎?

delete from tvsemp e 
where rowid>(select min(rowid) from tvsemp m where e.ename=m.ename); 

答案是肯定的。

至於它是如何工作的,你的子查詢是一個相關的子查詢,這基本上意味着它引用外部查詢。 Oracle爲tvsemp e的每一行執行子查詢,並且子查詢中的e.ename = m.ename將子查詢的結果限制爲ename等於外部查詢當前行中的ename的行。

獲取n - 1結果正是你想要的:如果有四行的名稱爲Chay,你想刪除它們中的三個。換句話說,如果有四行的名稱爲Chay,則其中只有一行將具有最小值ROWID值。其他三個的ROWID會高於最小值,因此DELETE查詢將刪除它們。

我希望這是有道理的。有關於子查詢的更多信息(包括相關的子查詢)here

+0

謝謝你,吉布斯是有幫助的。你的意思是相關的子查詢作爲循環。即它將處理每一行直到循環終止而沒有行? – Chay

+0

有一個循環,但外部查詢('from tvsemp e')控制它:在外部查詢中爲每一行調用子查詢。很難解釋。我在答案中給出的鏈接有一些可能有用的例子。 –

+0

ok沒有問題會通過文檔一次。謝謝 – Chay