社員ブログ
HOME  社員ブログ
ホーム > MySQL, 社員:カズマ > UNIONでKEYが重複するデータを弾く

UNIONでKEYが重複するデータを弾く

2011年04月19日 10時25分30秒

こんにちは、カズマです。


備忘録です。

「2つのテーブルをUNIONする際に重複するデータは表示しない」

ということがやりたかったので、やってみました。


①まずテーブルを用意

Create Table test1 (id INT, name VARCHAR(10), PRIMARY KEY (id));

Create Table test2 (id INT, name VARCHAR(10), PRIMARY KEY(id));


②テスト用データを登録させる

※primary keyはtest1とtest2で同じ値をセットする

INSERT INTO test1 (id,name) values(1,"名前");

INSERT INTO test1 (id,name) values(2,"名前");

INSERT INTO test1 (id,name) values(4,"名前");

INSERT INTO test2 (id,name) values(1,"名前1");

INSERT INTO test2 (id,name) values(2,"名前2");

INSERT INTO test2 (id,name) values(3,"名前3");


③test1のデータとtest2のデータをUNIONしてSELECTさせる

その際、下記条件を満たすようにする

(1) test1とtest2にてprimary keyが重複するデータはtest1のデータを表示

(2) test1にのみ存在するデータは表示

(3) test2にのみ存在するデータも表示

(4) idの昇順で表示する

sql

(SELECT
    *
FROM
    test1
)
UNION ALL
(SELECT
    *
FROM
    test2
WHERE
    NOT EXISTS (SELECT
                    *
                FROM
                    test1
                WHERE
                    test1.id = test2.id
                )
) ORDER BY id


※補足

UNION時にORDER BY を掛けるにはそれぞれのSELECT文を()で括る必要あり

ORDER BY に指定するカラム名は一番最初にSELECTしたカラム名を使用

※SELECT UNION結果のカラム名は一番最初のSELECT結果のカラム名が使用される為

・UNION(ALL無し)では重複データは弾いてくれるが

あくまで「SELECT結果にて全てのカラムが重複するデータを弾いてくれる」ということである。

よって、下記2つのSQLの取得行数は異なる

SELECT id FROM test1 UNION SELECT id FROM test2;

SELECT id,name FROM test1 UNION SELECT id,name FROM test2;


④実行結果

id name
1 名前
2 名前
3 名前3
4 名前

⑤出来た。

MySQL, 社員:カズマ

  1. コメントはまだありません
  1. トラックバックはまだありません