なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

SQLもプログラミング言語…っぽい3

テーブルの自己結合

以下のようなテーブルがあり

CREATE TABLE name("pkey" text, "number" int, "family_name" text, "name" text);

INSERT INTO name("pkey", "number", "family_name", "name") VALUES (00001, 12345, "山田", "太郎"); 
INSERT INTO name("pkey", "number", "family_name", "name") VALUES (00002, 12346, "山田", "花子"); 
INSERT INTO name("pkey", "number", "family_name", "name") VALUES (00003, 12346, "山田", "花子"); 
INSERT INTO name("pkey", "number", "family_name", "name") VALUES (00004, 12347, "山田", "嘘子"); 
INSERT INTO name("pkey", "number", "family_name", "name") VALUES (00005, 12348, "山田", "良子"); 
主キー 整理番号 ...
00001 12345 山田 太郎 ...
00002 12346 山田 花子 ...
00003 12346 山田 花子 ...
00004 12347 山田 嘘子 ...
00005 12348 山田 良子 ...

主キーは異なるが、あるカラムについては重複があるレコードを探し出したいとする。GROUP BYするか?しかしそれだと何件重複があるのかわからんし…そんな時テーブルの自己結合が使える。

あるテーブル内にある重複レコードを抽出したい場合melpon.org

SELECT * FROM name WHERE pkey IN
(
 SELECT n1.pkey
 FROM name n1, name n2
 WHERE n1.pkey <> n2.pkey
 AND n1.number = n2.number
);

FROM句の後に来るのが実際同じテーブルだとしても特に問題なくWHEREで検索条件を指定できる。

この本が実用的で面白かったです。

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

書籍の内容としては「1−2 自己結合の使い方」、になります。

IN句やサブクエリについては以下のエントリをどうぞnantonaku-shiawase.hatenablog.com
nantonaku-shiawase.hatenablog.com