2012-03-03 50 views
0

我正在使用oracle數據庫。我想從一個表中使用重複的行,除了一個,這意味着我想刪除所有行,但至少有一行應該在那裏。 我有一個表從oracle刪除重複的行

employee_id ---- department_id 
1      10 
2      10 
1      20 
3      30 
2      30 

現在我想刪除重複的行,但至少一行應該在那裏。

select count(employee_id),employee_id 
from employee 
group by employee_id 
having count(employee_id) >1)); 

我曾經用它找到多個部門的員工人數,但找不到進一步移動的方法。如果我使用刪除那裏它將刪除所有重複,但我想保留一個副本。

從empl的 刪除其中ENO IN(來自( SELECT COUNT(ENO),通過ENO 具有計數(ENO)ENO 從empl的 組> 選擇ENO 1));

編輯:我想留住僱員標識 任何一個誰可以指導我進一步

+2

@ ZanShah120 - 你關心你留住哪一行?你關心employee_id'1是否停留在'department_id'10或20? – 2012-03-03 08:22:32

+0

我想保留employe_id – 2012-03-03 08:23:18

+0

@ ZanShah120 - 這是什麼意思?我相信你想保留一行有'employee_id' 1.有在你發佈的數據中沒有重複的行,有兩行'employee_id'1,但它們有不同的'department_id'值。你想要保留哪兩個'department_id'值?你總是希望最大的'department_id' ?最小?其他? – 2012-03-03 08:26:48

回答

3
delete from employee a 
where employee_id in (
    select employee_id 
    from employee b 
    where b.department_id > a.department_id) 
2

使用子查詢來刪除重複的行

在這裏,我們看到使用SQL刪除的例子使用SQL子查詢重複錶行以識別重複行,手動指定連接列:

DELETE FROM 
    table_name A 
WHERE 
    a.rowid > 
    ANY (
    SELECT 
     B.rowid 
    FROM 
     table_name B 
    WHERE 
     A.col1 = B.col1 
    AND 
     A.col2 = B.col2 
     ); 

使用RANK來刪除重複的行

這是RANK函數從Oracle表識別並刪除重複的行,這將刪除所有重複行,同時保留重複行的初始實例的例子:

delete from $table_name where rowid in 
    (
    select "rowid" from 
    (select "rowid", rank_n from 
     (select rank() over (partition by $primary_key order by rowid) rank_n, rowid as "rowid" 
      from $table_name 
      where $primary_key in 
       (select $primary_key from $table_name 
        group by $all_columns 
        having count(*) > 1 
       ) 
      ) 
     ) 
    where rank_n > 1 
) 

Oracle最重要的功能之一是能夠檢測並從表格中刪除重複的行。雖然許多Oracle DBA在表上放置主鍵參照完整性約束,但許多商店不使用RI,因爲它們需要靈活性。

-1

DELETE FROM名稱的 WHERE ROWID>(SELECT MIN(ROWID)FROM名B,其中b.name = a.name AND b.age = a.age