環境
CentOS7
PostgreSQL 11.18
試してみた
まずはそれぞれのテーブルにあるデータを確認しておこうっと。
-- products
postgres=# select * from products;
name | price | etc
--------+-------+--------------
りんご | 150 | 青森産
メロン | 3000 | 北海道産
ぶどう | 300 |
みかん | 80 |
梨 | 300 |
バナナ | 250 | フィリピン産
(6 行)
-- orders
postgres=# select * from orders;
name | farm_name | arrival_date | order_num
--------+--------------+--------------+-----------
りんご | 津軽ファーム | 2012-07-31 | 26
みかん | みかん園 | 2012-07-31 | 16
みかん | 紀州果樹園 | 2012-07-31 | 12
ぶどう | 津軽ファーム | 2012-07-31 | 8
梨 | 梨園 | 2012-07-31 | 14
メロン | メロン農園 | 2012-07-31 | 13
(6 行)
それぞれ6行ずつデータが入っていた。
まずはfrom句での交差結合だ。
postgres=# select * from products, orders;
name | price | etc | name | farm_name | arrival_date | order_num
--------+-------+--------------+--------+--------------+--------------+-----------
りんご | 150 | 青森産 | りんご | 津軽ファーム | 2012-07-31 | 26
りんご | 150 | 青森産 | みかん | みかん園 | 2012-07-31 | 16
りんご | 150 | 青森産 | みかん | 紀州果樹園 | 2012-07-31 | 12
(中略)
バナナ | 250 | フィリピン産 | ぶどう | 津軽ファーム | 2012-07-31 | 8
バナナ | 250 | フィリピン産 | 梨 | 梨園 | 2012-07-31 | 14
バナナ | 250 | フィリピン産 | メロン | メロン農園 | 2012-07-31 | 13
(36 行)
products
のりんごに対して、orders
のりんご、みかん、みかん、ぶどう〜と結合していくのか。
CROSS JOIN
を使っても同じように取得できるぞ。
postgres=# select * from products cross join orders;
name | price | etc | name | farm_name | arrival_date | order_num
--------+-------+--------------+--------+--------------+--------------+-----------
りんご | 150 | 青森産 | りんご | 津軽ファーム | 2012-07-31 | 26
りんご | 150 | 青森産 | みかん | みかん園 | 2012-07-31 | 16
(中略)
バナナ | 250 | フィリピン産 | ぶどう | 津軽ファーム | 2012-07-31 | 8
バナナ | 250 | フィリピン産 | 梨 | 梨園 | 2012-07-31 | 14
バナナ | 250 | フィリピン産 | メロン | メロン農園 | 2012-07-31 | 13
(36 行)
外部結合よりも正直シンプルだからわかりやすいね。
ただ、使い所はいまいち思いつかない。
参考
第6回 SQL基礎II|OSS-DB入門|OSS-DB道場|受験対策|DBスペシャリストを認定する資格 OSS-DB技術者認定試験
「OSS-DB技術者認定資格」は、Postgresqlをはじめとするオープンソースデータベースのスペシャリストを認定する資格です。DBスペシャリストの認定を受けたい方や、SQLやデータベースのしくみを学びたいにもおすすめです。
コメント