2014-04-14 141 views
4

你好,我有一個問題,同時刪除行, 我想保持在數據庫兩行,並刪除所有其他行 我發現在這個環節for delete row ,但它是一個查詢給出mysql語法限制功能。 但在oracle中沒有限制變量可用。 我該怎麼辦?刪除從數據庫中的所有行除第一拖行中的Oracle

DELETE FROM Table 
    WHERE DateColumn NOT IN (SELECT DateColumn 
          FROM Table 
         GROUP BY date(DateColumn) 
         ORDER BY DateColumn DESC 
          LIMIT 2); 

回答

1

該駕駛室通過這個查詢可以實現

DELETE FROM TABLE 
WHERE ROWID NOT IN 
    (SELECT ROWIDS FROM (SELECT MIN(ROWID) ROWIDS 
          FROM TABLE 
          GROUP BY DATECOLUMN 
          ORDER BY DATECOLUMN DESC) 
     WHERE ROWNUM <= 2); 

內最查詢將返回ROWID的分表的,然後立即外部查詢將選擇在最外面的刪除中只需要避免兩行。

+0

這將刪除所有行,除了一個,因爲最小(rowid) –

+0

@TommyGrovnes由於它被分組在日期列,它會返回儘可能多的min rowid與由datecolumn組成的組的數量一樣多。 – San

+0

如果你所有的行都有相同的日期,它只會留下一行,因爲你只會得到一個組。 (極端的例子,但仍然) –

2

使用ROWID,ROWNUM和子查詢這樣的事情(未測試)

delete from table WHERE rowid NOT IN 
    (SELECT rowid FROM (SELECT rowid 
          FROM Table 
         ORDER BY DateColumn DESC) 
    WHERE rownum <= 2); 

通知「雙節」選擇是必要的,因爲ROWNUM其中具有ORDER BY混亂,因爲它是後應用在ROWNUM

如果日期並不重要,你只是想保持兩行(隨機),它可以簡化爲

delete from table WHERE rowid NOT IN 
    (SELECT rowid FROM table WHERE rownum <= 2); 
0
DELETE FROM Table 
    WHERE DateColumn NOT IN (SELECT DateColumn 
          FROM Table 
          Where ROWNUM < 3 
          GROUP BY date(DateColumn) 
          ORDER BY DateColumn DESC 
          ); 

我沒有oracle客戶端來運行查詢。您可以使用Oracle的ROWNUM的限制是無法在ORACLE

+1

如果日期不是唯一的,這可能會留下超過2行,同時rownum會破壞 –

+0

同意的訂單。如果日期或不唯一,那麼它可以保留多於2行..但是與LIMIT選項相同的情況。 –

+0

你是對的極限也許需要更多的細節問題 –

相關問題