2017-03-02 11 views
1

私は2つのテーブルemployeedepartmentsを持っています。別のテーブルの外部キーを持つテーブルから重複する行を削除しますか?

ID , name , salary, dep_ID 
1 | john | 2300 | 1 
2 | smith| 1500 | 2 
3 | john | 2300 | 1 
ここ

dep_idた 従業員テーブルはforeign key

ある今の部署今、私は

「従業員表からすべての重複行を削除」されて何をしたいのか

id, name 
1 | COMPUTER SCIENCE 
2 | MATHEMATICS 

+2

MySQLやOracleの?どのデータベースを使用していますか? – GurV

+0

@ Viki888 OPによって与えられたサンプルデータによると、重複を削除することはまったく問題ありません。 'john'の両方の行には同じ部門IDがあります。 –

+0

なぜこのためにDEPARTMENTテーブルが必要ですか?あなたが質問した方法、あなたはそれを必要としません。しかし、おそらくあなたのポストに入れたものよりもあなたの質問に多くのものがあります。次に:どのように "重複"を定義しますか? ID列によって区別されるため、EMPLOYEEテーブルに重複はありません。 「ID列以外」という意味ですか? – mathguy

答えて

1
delete from Employee 
where id not in 
     (
     select minid 
     from (
       select min(id) as minid 
       from Employee 
       group by 
         name 
       ,  salary 
       ,  dep_ID 
       ) sub 
     ) 

SQLのための0

+1

@UsamaHaleem "not working"を定義してください。このクエリは、*あなたがそれを述べたように問題を解決します*。 –

+0

おそらくMySQLでは別のサブクエリが必要でしょうか?回答 – Andomar

+0

に編集ありがとう.. ..thumbs up –

1

..

はdep_ID列にUNIQUEインデックスを追加します。 ALTERステートメントを記述するときは、IGNOREキーワードを含めます。

ALTER IGNORE TABLE社員 ADD UNIQUE INDEX idx_name(dep_ID);

これにより、重複する行がすべて削除され、重複した挿入が回避されます。

1

あなたが複数のステートメントと一時テーブルを使用して気にしない場合は、このソリューションは、任意のDBMSで動作します:

create table tmp as 
select min(ID), name, salary, dep_ID 
from employee 
group by name, salary, dep_ID; 

truncate table employee; 

insert into employee 
select * from tmp; 

drop table tmp; 
+0

ID列に重複が含まれていません – Andomar

+0

@Andomarだから私はIDをmin()でグループ化しています –

+0

おっと、そうです、私も同じ質問を使っています:) – Andomar

関連する問題