LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 3 years have passed since last update.

SQL 第2版 ゼロからはじめるデータベース操作 7章

Posted at

集合演算

集合演算はレコードの集合で、テーブル通しの四則演算ができる。

テーブルの足し算と引き算

UNION

テーブルの足し算

まずはテーブルの準備。
商品テーブルが既にあるので、商品テーブル2を作成する。

create table shohin2
(shohin_id char(4) not null,
 shohin_mei varchar(100) not null,
 shoihin_bunrui varchar(32) not null,
 hanbai_tanka integer ,
 shiire_tanka integer ,
 torokubi date ,
 primary key (shohin_id));
CREATE TABLE

begin transaction;

insert into shohin2 values ('0001', 'Tシャツ', '衣服', 1000, 500, '2008-09-20'),
                           ('0002', '穴あけパンチ', '事務用品', 500, 320, '2009-09-11'),
                           ('0003', 'カッターシャツ', '衣服', 4000, 2800, null),
                           ('0009', '手袋', '衣服', 800, 500, null),
                           ('0010', 'やかん', 'キッチン用品', 2000, 1700, '2009-09-20');
INSERT 0 5

commit; 
COMMIT

商品テーブルと商品テーブル2を足し算する。

select shohin_id, shohin_mei
 from shohin
 union
 select shohin_id, shohin_mei
 from shohin2;
 shohin_id |   shohin_mei   
-----------+----------------
 0006      | フォーク
 0009      | 手袋
 0005      | 圧力鍋
 0007      | おろしがね
 0008      | ボールペン
 0002      | 穴あけパンチ
 0001      | Tシャツ
 0003      | カッターシャツ
 0004      | 包丁
 0010      | やかん
(10 rows)

商品テーブルと商品テーブル2の和集合のイメージ
スクリーンショット 2020-06-14 14.58.43.png

集合演算の注意事項は演算対象となるレコードの列数は同じでないとエラーになる。

select shohin_id, shohin_mei
from shohin
union
select shohin_id, shohin_mei, hanbai_tanka
from shohin2;
ERROR:  each UNION query must have the same number of columns
LINE 4: select shohin_id, shohin_mei, hanbai_tanka

足し算の対象となるレコードの列のデータ型が一致していること

select shohin_id, hanbai_tanka
from shohin
union
select shohin_id, torokubi
from shohin2;
ERROR:  UNION types integer and date cannot be matched
LINE 4: select shohin_id, torokubi

SELECT文はどんなものを指定しても良いが、ORDER BY句は最後に一つだけ。

select shohin_id, shohin_mei
 from shohin
 where shohin_bunrui = 'キッチン用品'
 union
 select shohin_id,shohin_mei
 from shohin2
 where shohin_bunrui = 'キッチン用品'
 order by shohin_id;
 shohin_id | shohin_mei 
-----------+------------
 0004      | 包丁
 0005      | 圧力鍋
 0006      | フォーク
 0007      | おろしがね
 0010      | やかん
(5 rows)

ALLオプション
ALLをつけることで重複している行を表示させる

--allオプションなし
select shohin_id,shohin_mei
 from shohin
 union 
 select shohin_id, shohin_mei
 from shohin2;
 shohin_id | shohin_mei                                                  
-----------+-------------
 0006      | フォーク                                                                                                
 0009      | 手袋
 0005      | 圧力鍋                                                                                                 
 0007      | おろしがね                                                                                               
 0008      | ボールペン                                                                                               
 0002      | 穴あけパンチ                                                                                              
 0001      | Tシャツ                                                                                                
 0003      | カッターシャツ                                                                                             
 0004      | 包丁                                                                                                  
 0010      | やかん
(10 rows)


--allオプションあり
select shohin_id,shohin_mei
from shohin
union all
select shohin_id, shohin_mei
from shohin2;
 shohin_id |   shohin_mei   
-----------+----------------
 0001      | Tシャツ
 0002      | 穴あけパンチ
 0003      | カッターシャツ
 0004      | 包丁
 0005      | 圧力鍋
 0006      | フォーク
 0007      | おろしがね
 0008      | ボールペン
 0001      | Tシャツ
 0002      | 穴あけパンチ
 0003      | カッターシャツ
 0009      | 手袋
 0010      | やかん
(13 rows)

INTERSECT

共通部分の選択ができる

INTERSECTのイメージ図。黄色い塗られた部分。
名称未設定のノート-5.jpg

 select shohin_id, shohin_mei
 from shohin
 intersect
 select shohin_id, shohin_mei
 from shohin2
 group by shohin_id;
 shohin_id |   shohin_mei   
-----------+----------------
 0002      | 穴あけパンチ
 0001      | Tシャツ
 0003      | カッターシャツ
(3 rows)

EXCEPT

レコードの引き算
IMG_238C81CE4B31-1.jpeg

select shohin_id, shohin_mei
from shohin 
except
select shohin_id, shohin_mei
from shohin2;
 shohin_id | shohin_mei 
-----------+------------
 0006      | フォーク
 0005      | 圧力鍋
 0004      | 包丁
 0007      | おろしがね
 0008      | ボールペン
(5 rows)

上記の逆

select shohin_id, shohin_mei
from shohin2 
except
select shohin_id, shohin_mei
from shohin;
shohin_id | shohin_mei 
-----------+------------
 0009      | 手袋
 0010      | やかん
(2 rows)

結合

結合はテーブルどうしを結合して列を増やすことができる。
結合は非常に多様。
代表は内部結合(INNER JOIN) と 外部結合(OUTER JOIN)

INNER JOIN

ここでは商品テーブルと店舗テーブルのデータを用意する。
まずはそれぞれどんな値が入っているか確認する。

--商品テーブル
select * from shohin ;
 shohin_id |   shohin_mei   | shohin_bunrui | hanbai_tanka | shiire_tanka |  torokubi  
-----------+----------------+---------------+--------------+--------------+------------
 0001      | Tシャツ        | 衣服          |         1000 |          500 | 2009-09-20
 0002      | 穴あけパンチ   | 事務用品      |          500 |          320 | 2009-09-11
 0003      | カッターシャツ | 衣服          |         4000 |         2800 | 
 0004      | 包丁           | キッチン用品  |         3000 |         2800 | 2009-09-20
 0005      | 圧力鍋         | キッチン用品  |         6800 |         5000 | 2009-01-15
 0006      | フォーク       | キッチン用品  |          500 |              | 2009-09-20
 0007      | おろしがね     | キッチン用品  |          880 |          790 | 2008-04-28
 0008      | ボールペン     | 事務用品      |          100 |              | 2009-11-11
(8 rows)

--店舗テーブル
select * from tenposhohin ;
 tenpo_id | tenpo_mei | shohin_id | suryo 
----------+-----------+-----------+-------
 000A     | 東京      | 0001      |    30
 000A     | 東京      | 0002      |    50
 000A     | 東京      | 0003      |    15
 000B     | 名古屋    | 0002      |    30
 000B     | 名古屋    | 0003      |   120
 000B     | 名古屋    | 0004      |    20
 000B     | 名古屋    | 0006      |    10
 000B     | 名古屋    | 0007      |    40
 000C     | 大阪      | 0003      |    20
 000C     | 大阪      | 0004      |    50
 000C     | 大阪      | 0006      |    90
 000C     | 大阪      | 0007      |    70
 000D     | 福岡      | 0001      |   100
(13 rows)

テーブル単体で見ると店舗テーブルからはどの商品があるのかわかりづらい。
また商品テーブルから見ると、どの商品がどこで扱われているかわかりにく。
なので、INNER JOINを使用してわかりやすくする。

 select ts.*, s.*
from tenposhohin as ts inner join shohin as s  
on ts.shohin_id = s.shohin_id;
 tenpo_id | tenpo_mei | shohin_id | suryo | shohin_id |   shohin_mei   | shohin_bunrui | hanbai_tanka | shiire_tanka |  torokubi  
----------+-----------+-----------+-------+-----------+----------------+---------------+--------------+--------------+------------
 000A     | 東京      | 0001      |    30 | 0001      | Tシャツ        | 衣服          |         1000 |          500 | 2009-09-20
 000A     | 東京      | 0002      |    50 | 0002      | 穴あけパンチ   | 事務用品      |          500 |          320 | 2009-09-11
 000A     | 東京      | 0003      |    15 | 0003      | カッターシャツ | 衣服          |         4000 |         2800 | 
 000B     | 名古屋    | 0002      |    30 | 0002      | 穴あけパンチ   | 事務用品      |          500 |          320 | 2009-09-11
 000B     | 名古屋    | 0003      |   120 | 0003      | カッターシャツ | 衣服          |         4000 |         2800 | 
 000B     | 名古屋    | 0004      |    20 | 0004      | 包丁           | キッチン用品  |         3000 |         2800 | 2009-09-20
 000B     | 名古屋    | 0006      |    10 | 0006      | フォーク       | キッチン用品  |          500 |              | 2009-09-20
 000B     | 名古屋    | 0007      |    40 | 0007      | おろしがね     | キッチン用品  |          880 |          790 | 2008-04-28
 000C     | 大阪      | 0003      |    20 | 0003      | カッターシャツ | 衣服          |         4000 |         2800 | 
 000C     | 大阪      | 0004      |    50 | 0004      | 包丁           | キッチン用品  |         3000 |         2800 | 2009-09-20
 000C     | 大阪      | 0006      |    90 | 0006      | フォーク       | キッチン用品  |          500 |              | 2009-09-20
 000C     | 大阪      | 0007      |    70 | 0007      | おろしがね     | キッチン用品  |          880 |          790 | 2008-04-28
 000D     | 福岡      | 0001      |   100 | 0001      | Tシャツ        | 衣服          |         1000 |          500 | 2009-09-20
(13 rows)

--as(テーブルの省略)を使わないで書く書き方
select tenposhohin.*,shohin.* 
from tenposhohin inner join shohin on shohin.shohin_id = tenposhohin.shohin_id ;

 tenpo_id | tenpo_mei | shohin_id | suryo | shohin_id |   shohin_mei   | shohin_bunrui | hanbai_tanka | shiire_tanka |  torokubi  
----------+-----------+-----------+-------+-----------+----------------+---------------+--------------+--------------+------------
 000A     | 東京      | 0001      |    30 | 0001      | Tシャツ        | 衣服          |         1000 |          500 | 2009-09-20
 000A     | 東京      | 0002      |    50 | 0002      | 穴あけパンチ   | 事務用品      |          500 |          320 | 2009-09-11
 000A     | 東京      | 0003      |    15 | 0003      | カッターシャツ | 衣服          |         4000 |         2800 | 
 000B     | 名古屋    | 0002      |    30 | 0002      | 穴あけパンチ   | 事務用品      |          500 |          320 | 2009-09-11
 000B     | 名古屋    | 0003      |   120 | 0003      | カッターシャツ | 衣服          |         4000 |         2800 | 
 000B     | 名古屋    | 0004      |    20 | 0004      | 包丁           | キッチン用品  |         3000 |         2800 | 2009-09-20
 000B     | 名古屋    | 0006      |    10 | 0006      | フォーク       | キッチン用品  |          500 |              | 2009-09-20
 000B     | 名古屋    | 0007      |    40 | 0007      | おろしがね     | キッチン用品  |          880 |          790 | 2008-04-28
 000C     | 大阪      | 0003      |    20 | 0003      | カッターシャツ | 衣服          |         4000 |         2800 | 
 000C     | 大阪      | 0004      |    50 | 0004      | 包丁           | キッチン用品  |         3000 |         2800 | 2009-09-20
 000C     | 大阪      | 0006      |    90 | 0006      | フォーク       | キッチン用品  |          500 |              | 2009-09-20
 000C     | 大阪      | 0007      |    70 | 0007      | おろしがね     | キッチン用品  |          880 |          790 | 2008-04-28
 000D     | 福岡      | 0001      |   100 | 0001      | Tシャツ        | 衣服          |         1000 |          500 | 2009-09-20
(13 rows)

FORM区にtenposhohinとshohinを二つ書いている。
それを実現するのがINNER JOIN
WHERE区と組み合わせて絞り込むこともできる
例えば東京店だけ探したい場合は以下のようにかける

select tenposhohin.*,shohin.* 
from tenposhohin 
inner join shohin 
on shohin.shohin_id = tenposhohin.shohin_id 
where tenposhohin.tenpo_id = '000A'; 
 tenpo_id | tenpo_mei | shohin_id | suryo | shohin_id |   shohin_mei   | shohin_bunrui | hanbai_tanka | shiire_tanka |  torokubi  
----------+-----------+-----------+-------+-----------+----------------+---------------+--------------+--------------+------------
 000A     | 東京      | 0001      |    30 | 0001      | Tシャツ        | 衣服          |         1000 |          500 | 2009-09-20
 000A     | 東京      | 0002      |    50 | 0002      | 穴あけパンチ   | 事務用品      |          500 |          320 | 2009-09-11
 000A     | 東京      | 0003      |    15 | 0003      | カッターシャツ | 衣服          |         4000 |         2800 | 
(3 rows)

外部結合 OUTER JOIN

外部結合と内部結合は2つのテーブルをON句でつなぎ、2つのテーブルから同時に列を選択する使い方は変わらない。
まずはOUTER JOINの挙動を確認する。

select tenposhohin.*,shohin.* 
from tenposhohin 
right outer join shohin 
on shohin.shohin_id = tenposhohin.shohin_id ;                                    

 tenpo_id | tenpo_mei | shohin_id | suryo | shohin_id |   shohin_mei   | shohin_bunrui | hanbai_tanka | shiire_tanka |  torokubi  
----------+-----------+-----------+-------+-----------+----------------+---------------+--------------+--------------+------------
 000A     | 東京      | 0001      |    30 | 0001      | Tシャツ        | 衣服          |         1000 |          500 | 2009-09-20
 000A     | 東京      | 0002      |    50 | 0002      | 穴あけパンチ   | 事務用品      |          500 |          320 | 2009-09-11
 000A     | 東京      | 0003      |    15 | 0003      | カッターシャツ | 衣服          |         4000 |         2800 | 
 000B     | 名古屋    | 0002      |    30 | 0002      | 穴あけパンチ   | 事務用品      |          500 |          320 | 2009-09-11
 000B     | 名古屋    | 0003      |   120 | 0003      | カッターシャツ | 衣服          |         4000 |         2800 | 
 000B     | 名古屋    | 0004      |    20 | 0004      | 包丁           | キッチン用品  |         3000 |         2800 | 2009-09-20
 000B     | 名古屋    | 0006      |    10 | 0006      | フォーク       | キッチン用品  |          500 |              | 2009-09-20
 000B     | 名古屋    | 0007      |    40 | 0007      | おろしがね     | キッチン用品  |          880 |          790 | 2008-04-28
 000C     | 大阪      | 0003      |    20 | 0003      | カッターシャツ | 衣服          |         4000 |         2800 | 
 000C     | 大阪      | 0004      |    50 | 0004      | 包丁           | キッチン用品  |         3000 |         2800 | 2009-09-20
 000C     | 大阪      | 0006      |    90 | 0006      | フォーク       | キッチン用品  |          500 |              | 2009-09-20
 000C     | 大阪      | 0007      |    70 | 0007      | おろしがね     | キッチン用品  |          880 |          790 | 2008-04-28
 000D     | 福岡      | 0001      |   100 | 0001      | Tシャツ        | 衣服          |         1000 |          500 | 2009-09-20
          |           |           |       | 0008      | ボールペン     | 事務用品      |          100 |              | 2009-11-11
          |           |           |       | 0005      | 圧力鍋         | キッチン用品  |         6800 |         5000 | 2009-01-15
(15 rows)

上記をよく見ると、店舗が紐づいてない商品も出力されている。
つまり指定した片方のテーブルが全て表示される。
なので、たとえば店舗が登録されてない商品を出力するのは以下のようにかける

select tenposhohin.*,shohin.* 
from tenposhohin 
right outer join shohin 
on shohin.shohin_id = tenposhohin.shohin_id 
where tenposhohin.tenpo_id is null ;
 tenpo_id | tenpo_mei | shohin_id | suryo | shohin_id | shohin_mei | shohin_bunrui | hanbai_tanka | shiire_tanka |  torokubi  
----------+-----------+-----------+-------+-----------+------------+---------------+--------------+--------------+------------
          |           |           |       | 0008      | ボールペン | 事務用品      |          100 |              | 2009-11-11
          |           |           |       | 0005      | 圧力鍋     | キッチン用品  |         6800 |         5000 | 2009-01-15
(2 rows)

また外部結合はマスタテーブルが全て出力される。
どちらのテーブルをマスタにするかでLEFTとRIGHTを使い分ける。

select tenposhohin.*,shohin.* 
from tenposhohin 
left outer join shohin  --マスタテーブルが店舗商品
on shohin.shohin_id = tenposhohin.shohin_id;

tenpo_id | tenpo_mei | shohin_id | suryo | shohin_id | shohin_mei | shohin_bunrui | hanbai_tanka | shiire_tanka |  torokubi  
----------+-----------+-----------+-------+-----------+-----------+-------------+--------------+--------------+------------
 000A     | 東京      | 0001      |    30 | 0001      | Tシャツ      | 衣服          |         1000 |          500 | 2009-09-20
 000A     | 東京      | 0002      |    50 | 0002      | 穴あけパンチ  | 事務用品      |          500 |          320 | 2009-09-11
 000A     | 東京      | 0003      |    15 | 0003      | カッターシャツ  | 衣服          |         4000 |         2800 | 
 000B     | 名古屋    | 0002      |    30 | 0002      | 穴あけパンチ   | 事務用品      |          500 |          320 | 2009-09-11
 000B     | 名古屋    | 0003      |   120 | 0003      | カッターシャツ   | 衣服          |         4000 |         2800 | 
 000B     | 名古屋    | 0004      |    20 | 0004      | 包丁          | キッチン用品  |         3000 |         2800 | 2009-09-20
 000B     | 名古屋    | 0006      |    10 | 0006      | フォーク        | キッチン用品  |          500 |              | 2009-09-20
 000B     | 名古屋    | 0007      |    40 | 0007      | おろしがね      | キッチン用品  |          880 |          790 | 2009-04-28
 000C     | 大阪      | 0003      |    20 | 0003      | カッターシャツ   | 衣服          |         4000 |         2800 | 
 000C     | 大阪      | 0004      |    50 | 0004      | 包丁          | キッチン用品  |         3000 |         2800 | 2009-09-20
 000C     | 大阪      | 0006      |    90 | 0006      | フォーク        | キッチン用品  |          500 |              | 2009-09-20
 000C     | 大阪      | 0007      |    70 | 0007      | おろしがね     | キッチン用品  |          880 |          790 | 2009-04-28
 000D     | 福岡      | 0001      |   100 | 0001      | Tシャツ        | 衣服          |         1000 |          500 | 2009-09-20
(13 rows)

3つのテーブルを内部結合してみる

まずは3つめのテーブルの準備

 create table zaikoshohin
( souko_id char(4) not null,
shohin_id char(4) not null,
zaiko_suryo integer not null,
primary key (souko_id, shohin_id));
CREATE TABLE

begin transaction;
BEGIN

insert into zaikoshohin (souko_id, shohin_id, zaiko_suryo)
values('s001','0001',0),
('s001','0002',120),
('s001','0003',200),
('s001','0004',3),
('s001','0005',0),
('s001','0006',99),
('s001','0007',999),
('s001','0008',200),
('s002','0001',10),
('s002','0002',25),
('s002','0003',34),
('s002','0004',34),
('s002','0005',99),
('s002','0006',0),
('s002','0007',0),
('s002','0008',10);
INSERT 0 16

commit;
COMMIT

 select * from  zaikoshohin;
 souko_id | shohin_id | zaiko_suryo 
----------+-----------+-------------
 s001     | 0001      |           0
 s001     | 0002      |         120
 s001     | 0003      |         200
 s001     | 0004      |           3
 s001     | 0005      |           0
 s001     | 0006      |          99
 s001     | 0007      |         999
 s001     | 0008      |         200
 s002     | 0001      |          10
 s002     | 0002      |          25
 s002     | 0003      |          34
 s002     | 0004      |          34
 s002     | 0005      |          99
 s002     | 0006      |           0
 s002     | 0007      |           0
 s002     | 0008      |          10
(16 rows)

商品と店舗、在庫を全て内部結合すると以下のようになる

select ts.tenpo_id, ts.tenpo_mei, ts.shohin_id, s.shohin_mei,s.hanbai_tanka, zs.zaiko_suryo 
from tenposhohin as ts inner join shohin as s
on ts.shohin_id = s.shohin_id
inner join zaikoshohin as zs
on s.shohin_id = zs.shohin_id
;
 tenpo_id | tenpo_mei | shohin_id |   shohin_mei   | hanbai_tanka | zaiko_suryo 
----------+-----------+-----------+----------------+--------------+-------------
 000D     | 福岡      | 0001      | Tシャツ        |         1000 |           0
 000A     | 東京      | 0001      | Tシャツ        |         1000 |           0
 000B     | 名古屋    | 0002      | 穴あけパンチ   |          500 |         120
 000A     | 東京      | 0002      | 穴あけパンチ   |          500 |         120
 000C     | 大阪      | 0003      | カッターシャツ |         4000 |         200
 000B     | 名古屋    | 0003      | カッターシャツ |         4000 |         200
 000A     | 東京      | 0003      | カッターシャツ |         4000 |         200
 000C     | 大阪      | 0004      | 包丁           |         3000 |           3
 000B     | 名古屋    | 0004      | 包丁           |         3000 |           3
 000C     | 大阪      | 0006      | フォーク       |          500 |          99
 000B     | 名古屋    | 0006      | フォーク       |          500 |          99
 000C     | 大阪      | 0007      | おろしがね     |          880 |         999
 000B     | 名古屋    | 0007      | おろしがね     |          880 |         999
 000D     | 福岡      | 0001      | Tシャツ        |         1000 |          10
 000A     | 東京      | 0001      | Tシャツ        |         1000 |          10
 000B     | 名古屋    | 0002      | 穴あけパンチ   |          500 |          25
 000A     | 東京      | 0002      | 穴あけパンチ   |          500 |          25
 000C     | 大阪      | 0003      | カッターシャツ |         4000 |          34
 000B     | 名古屋    | 0003      | カッターシャツ |         4000 |          34
 000A     | 東京      | 0003      | カッターシャツ |         4000 |          34
 000C     | 大阪      | 0004      | 包丁           |         3000 |          34
 000B     | 名古屋    | 0004      | 包丁           |         3000 |          34
 000C     | 大阪      | 0006      | フォーク       |          500 |           0
 000B     | 名古屋    | 0006      | フォーク       |          500 |           0
 000C     | 大阪      | 0007      | おろしがね     |          880 |           0
 000B     | 名古屋    | 0007      | おろしがね     |          880 |           0
(26 rows)

クロス結合(直積) CROSS JOIN

これは実務ではほとんど使わない
クロス結合は2つのテーブルのレコードについて、すべての組み合わせを作る結合方法。
行数は常に、2つのテーブル行数の掛け算になる。
商品テーブルは8行、店舗テーブルは13行なので、クロス結合すると104行になる。

select ts.tenpo_id, ts.tenpo_mei, ts.shohin_id, s.shohin_mei
 from tenposhohin as ts cross join shohin as s;
 tenpo_id | tenpo_mei | shohin_id |   shohin_mei   
----------+-----------+-----------+----------------
 000A     | 東京      | 0001      | Tシャツ
 000A     | 東京      | 0002      | Tシャツ
 000A     | 東京      | 0003      | Tシャツ
 000B     | 名古屋    | 0002      | Tシャツ
 000B     | 名古屋    | 0003      | Tシャツ
 000B     | 名古屋    | 0004      | Tシャツ
 000B     | 名古屋    | 0006      | Tシャツ
 000B     | 名古屋    | 0007      | Tシャツ
 000C     | 大阪      | 0003      | Tシャツ
 000C     | 大阪      | 0004      | Tシャツ
 000C     | 大阪      | 0006      | Tシャツ
 000C     | 大阪      | 0007      | Tシャツ
 000D     | 福岡      | 0001      | Tシャツ
 000A     | 東京      | 0001      | 穴あけパンチ
 000A     | 東京      | 0002      | 穴あけパンチ
 000A     | 東京      | 0003      | 穴あけパンチ
 000B     | 名古屋    | 0002      | 穴あけパンチ
 000B     | 名古屋    | 0003      | 穴あけパンチ
 000B     | 名古屋    | 0004      | 穴あけパンチ
 000B     | 名古屋    | 0006      | 穴あけパンチ
 000B     | 名古屋    | 0007      | 穴あけパンチ
 000C     | 大阪      | 0003      | 穴あけパンチ
 000C     | 大阪      | 0004      | 穴あけパンチ
 000C     | 大阪      | 0006      | 穴あけパンチ
 000C     | 大阪      | 0007      | 穴あけパンチ
 000D     | 福岡      | 0001      | 穴あけパンチ
 000A     | 東京      | 0001      | カッターシャツ
 000A     | 東京      | 0002      | カッターシャツ
 000A     | 東京      | 0003      | カッターシャツ
 000B     | 名古屋    | 0002      | カッターシャツ
 000B     | 名古屋    | 0003      | カッターシャツ
 000B     | 名古屋    | 0004      | カッターシャツ
 000B     | 名古屋    | 0006      | カッターシャツ
 000B     | 名古屋    | 0007      | カッターシャツ
 000C     | 大阪      | 0003      | カッターシャツ
 000C     | 大阪      | 0004      | カッターシャツ
 000C     | 大阪      | 0006      | カッターシャツ
 000C     | 大阪      | 0007      | カッターシャツ
 000D     | 福岡      | 0001      | カッターシャツ
 000A     | 東京      | 0001      | 包丁
 000A     | 東京      | 0002      | 包丁
 000A     | 東京      | 0003      | 包丁
 000B     | 名古屋    | 0002      | 包丁
 000B     | 名古屋    | 0003      | 包丁
 000B     | 名古屋    | 0004      | 包丁
 000B     | 名古屋    | 0006      | 包丁
 000B     | 名古屋    | 0007      | 包丁
 000C     | 大阪      | 0003      | 包丁
 000C     | 大阪      | 0004      | 包丁
 000C     | 大阪      | 0006      | 包丁
 000C     | 大阪      | 0007      | 包丁
 000D     | 福岡      | 0001      | 包丁
 000A     | 東京      | 0001      | 圧力鍋
 000A     | 東京      | 0002      | 圧力鍋
 000A     | 東京      | 0003      | 圧力鍋
 000B     | 名古屋    | 0002      | 圧力鍋
 000B     | 名古屋    | 0003      | 圧力鍋
 000B     | 名古屋    | 0004      | 圧力鍋
 000B     | 名古屋    | 0006      | 圧力鍋
 000B     | 名古屋    | 0007      | 圧力鍋
 000C     | 大阪      | 0003      | 圧力鍋
 000C     | 大阪      | 0004      | 圧力鍋
 000C     | 大阪      | 0006      | 圧力鍋
 000C     | 大阪      | 0007      | 圧力鍋
 000D     | 福岡      | 0001      | 圧力鍋
 000A     | 東京      | 0001      | フォーク
 000A     | 東京      | 0002      | フォーク
 000A     | 東京      | 0003      | フォーク
 000B     | 名古屋    | 0002      | フォーク
 000B     | 名古屋    | 0003      | フォーク
 000B     | 名古屋    | 0004      | フォーク
 000B     | 名古屋    | 0006      | フォーク
 000B     | 名古屋    | 0007      | フォーク
 000C     | 大阪      | 0003      | フォーク
 000C     | 大阪      | 0004      | フォーク
 000C     | 大阪      | 0006      | フォーク
 000C     | 大阪      | 0007      | フォーク
 000D     | 福岡      | 0001      | フォーク
 000A     | 東京      | 0001      | おろしがね
 000A     | 東京      | 0002      | おろしがね
 000A     | 東京      | 0003      | おろしがね
 000B     | 名古屋    | 0002      | おろしがね
 000B     | 名古屋    | 0003      | おろしがね
 000B     | 名古屋    | 0004      | おろしがね
 000B     | 名古屋    | 0006      | おろしがね
 000B     | 名古屋    | 0007      | おろしがね
 000C     | 大阪      | 0003      | おろしがね
 000C     | 大阪      | 0004      | おろしがね
 000C     | 大阪      | 0006      | おろしがね
 000C     | 大阪      | 0007      | おろしがね
 000D     | 福岡      | 0001      | おろしがね
 000A     | 東京      | 0001      | ボールペン
 000A     | 東京      | 0002      | ボールペン
 000A     | 東京      | 0003      | ボールペン
 000B     | 名古屋    | 0002      | ボールペン
 000B     | 名古屋    | 0003      | ボールペン
 000B     | 名古屋    | 0004      | ボールペン
 000B     | 名古屋    | 0006      | ボールペン
 000B     | 名古屋    | 0007      | ボールペン
 000C     | 大阪      | 0003      | ボールペン
 000C     | 大阪      | 0004      | ボールペン
 000C     | 大阪      | 0006      | ボールペン
 000C     | 大阪      | 0007      | ボールペン
 000D     | 福岡      | 0001      | ボールペン
(104 rows)
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up