SQL練習 – 重複レコードを削除し、最小の ID に対応するレコードのみを保持します

sql SQL練習

sql練習 

今回のテーマは、テーブル emp_no の重複レコードを削除し、最小の ID に対応するレコードのみを保持します。

それでは、始めましょう

流れ
  • テーブル emp_no を作る
  • テーブル emp_no に レコードを挿入する
  • 今回のテーマの解答

順番にやっていきます。

1.テーブル emp_no を作る

CREATE TABLE IF NOT EXISTS titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);

2.テーブル emp_no に レコードを挿入する

insert into titles_test values 
('1', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
('2', '10002', 'Staff', '1996-08-03', '9999-01-01'),
('3', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01'),
('4', '10004', 'Senior Engineer', '1995-12-03', '9999-01-01'),
('5', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
('6', '10002', 'Staff', '1996-08-03', '9999-01-01'),
('7', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01');

挿入後は、下記の通り

+----+--------+-----------------+------------+------------+
| id | emp_no | title           | from_date  | to_date    |
+----+--------+-----------------+------------+------------+
|  1 |  10001 | Senior Engineer | 1986-06-26 | 9999-01-01 |
|  2 |  10002 | Staff           | 1996-08-03 | 9999-01-01 |
|  3 |  10003 | Senior Engineer | 1995-12-03 | 9999-01-01 |
|  4 |  10004 | Senior Engineer | 1995-12-03 | 9999-01-01 |
|  5 |  10001 | Senior Engineer | 1986-06-26 | 9999-01-01 |
|  6 |  10002 | Staff           | 1996-08-03 | 9999-01-01 |
|  7 |  10003 | Senior Engineer | 1995-12-03 | 9999-01-01 |
+----+--------+-----------------+------------+------------+

3. 解答

  • まず、最小の ID に対応するレコードを見つける
  • 次に、最小の ID に対応するレコードと重複しているレコードを見つける
  • 最後に、その重複レコードを全部削除する
delete from titles_test 
where id in
(
    select * from 
    (
        select tt.id
from titles_test as tt, 
(
    select emp_no, min(id) as id from titles_test 
group by emp_no 
) a 
where  tt.emp_no = a.emp_no 
and tt.id not in (a.id)
    ) as T1
);

結果確認

+----+--------+-----------------+------------+------------+
| id | emp_no | title           | from_date  | to_date    |
+----+--------+-----------------+------------+------------+
|  1 |  10001 | Senior Engineer | 1986-06-26 | 9999-01-01 |
|  2 |  10002 | Staff           | 1996-08-03 | 9999-01-01 |
|  3 |  10003 | Senior Engineer | 1995-12-03 | 9999-01-01 |
|  4 |  10004 | Senior Engineer | 1995-12-03 | 9999-01-01 |
+----+--------+-----------------+------------+------------+

コメント

タイトルとURLをコピーしました