問合わせ(Select)には、さまざまな構文があります。
ここから数回にわたって、さまざまな方法の問合わせを学んでゆきます。
「テーブル結合」と言う場合もありますが、ここはPostgreSQLのマニュアルの書き方にしたがって統一します。
マニュアルに結合テーブルは2つの(実または派生)テーブルから、指定した結合種類の規則に従って派生したテーブルです。内部結合、外部結合、およびクロス結合が使用可能です。
とあります。
言葉だけ見ても良くわからないと思うので、ひとつずつ簡単なものから確認していきます。
もっとも簡単なテーブル結合の方法です。
クロスとあるように、すべての組み合わせで結合を行います。
百聞は一見にしかずということで、実際にどういうSQL文を書くのかと、実行結果を見てみましょう。
lain=> Select * From materielmaster; materielcode | materieldivcode | materielstatus | materielmaker | modelno | productno | serialno | note1 | note2 | registdate | discarddate --------------+-----------------+----------------+---------------+----------+-----------+----------+-------+-------+----------------------------+------------- 1 | 2 | 1 | DoLL | INSPIRON | D0001 | 000001 | | | 2008-06-11 15:03:38.175615 | 2 | 2 | 1 | DoLL | INSPIRON | D0002 | 000012 | | | 2008-06-11 15:17:35.181786 | 3 | 2 | 1 | DoLL | INSPIRON | D0003 | 000031 | | | 2008-06-11 15:17:35.188106 | 4 | 2 | 1 | DoLL | INSPIRON | D0004 | 000400 | | | 2008-06-11 15:17:35.189831 | 5 | 2 | 1 | DoLL | INSPIRON | D0005 | 000512 | | | 2008-06-11 15:17:35.191721 | 6 | 1 | 1 | DoLL | VOSTRO | DD001 | 001261 | | | 2008-06-11 15:17:35.193488 | 7 | 1 | 1 | DoLL | VOSTRO | DD002 | 024714 | | | 2008-06-11 15:17:35.195162 | 8 | 1 | 1 | DoLL | VOSTRO | DD003 | 004614 | | | 2008-06-11 15:17:35.196896 | 9 | 1 | 1 | DoLL | VOSTRO | DD004 | 000335 | | | 2008-06-11 15:17:35.198619 | 10 | 1 | 1 | DoLL | VOSTRO | DD005 | 004812 | | | 2008-06-11 15:17:35.200557 | 11 | 3 | 1 | oIZO | S2100 | E0001 | 021341 | | | 2008-06-11 15:17:35.202343 | 12 | 3 | 1 | oIZO | S2100 | E0002 | 002321 | | | 2008-06-11 15:17:35.204004 | 13 | 3 | 1 | oIZO | S2100 | E0003 | 002324 | | | 2008-06-11 15:17:35.205643 | 14 | 3 | 1 | oIZO | S2100 | E0004 | 002325 | | | 2008-06-11 15:17:35.207366 | 15 | 3 | 1 | oIZO | S2100 | E0005 | 002365 | | | 2008-06-11 15:17:35.209097 | (15 rows) lain=> Select * From materieldivmaster; materieldivcode | materieldivname | materieldivnote -----------------+------------------------+----------------- 1 | デスクトップパソコン | 2 | ノートパソコン | 3 | ディスプレイ | 4 | パッケージソフトウェア | 5 | シェアウェア | (5 rows) lain=> Select * From materielmaster Cross Join materieldivmaster; materielcode | materieldivcode | materielstatus | materielmaker | modelno | productno | serialno | note1 | note2 | registdate | discarddate | materieldivcode | materieldivname | materieldivnote --------------+-----------------+----------------+---------------+----------+-----------+----------+-------+-------+----------------------------+-------------+-----------------+------------------------+----------------- 1 | 2 | 1 | DoLL | INSPIRON | D0001 | 000001 | | | 2008-06-11 15:03:38.175615 | | 1 | デスクトップパソコン | 2 | 2 | 1 | DoLL | INSPIRON | D0002 | 000012 | | | 2008-06-11 15:17:35.181786 | | 1 | デスクトップパソコン | 3 | 2 | 1 | DoLL | INSPIRON | D0003 | 000031 | | | 2008-06-11 15:17:35.188106 | | 1 | デスクトップパソコン | 4 | 2 | 1 | DoLL | INSPIRON | D0004 | 000400 | | | 2008-06-11 15:17:35.189831 | | 1 | デスクトップパソコン | 5 | 2 | 1 | DoLL | INSPIRON | D0005 | 000512 | | | 2008-06-11 15:17:35.191721 | | 1 | デスクトップパソコン | 6 | 1 | 1 | DoLL | VOSTRO | DD001 | 001261 | | | 2008-06-11 15:17:35.193488 | | 1 | デスクトップパソコン | 7 | 1 | 1 | DoLL | VOSTRO | DD002 | 024714 | | | 2008-06-11 15:17:35.195162 | | 1 | デスクトップパソコン | 8 | 1 | 1 | DoLL | VOSTRO | DD003 | 004614 | | | 2008-06-11 15:17:35.196896 | | 1 | デスクトップパソコン | 9 | 1 | 1 | DoLL | VOSTRO | DD004 | 000335 | | | 2008-06-11 15:17:35.198619 | | 1 | デスクトップパソコン | 10 | 1 | 1 | DoLL | VOSTRO | DD005 | 004812 | | | 2008-06-11 15:17:35.200557 | | 1 | デスクトップパソコン | 11 | 3 | 1 | oIZO | S2100 | E0001 | 021341 | | | 2008-06-11 15:17:35.202343 | | 1 | デスクトップパソコン | 12 | 3 | 1 | oIZO | S2100 | E0002 | 002321 | | | 2008-06-11 15:17:35.204004 | | 1 | デスクトップパソコン | 13 | 3 | 1 | oIZO | S2100 | E0003 | 002324 | | | 2008-06-11 15:17:35.205643 | | 1 | デスクトップパソコン | 14 | 3 | 1 | oIZO | S2100 | E0004 | 002325 | | | 2008-06-11 15:17:35.207366 | | 1 | デスクトップパソコン | 15 | 3 | 1 | oIZO | S2100 | E0005 | 002365 | | | 2008-06-11 15:17:35.209097 | | 1 | デスクトップパソコン | 1 | 2 | 1 | DoLL | INSPIRON | D0001 | 000001 | | | 2008-06-11 15:03:38.175615 | | 2 | ノートパソコン | 2 | 2 | 1 | DoLL | INSPIRON | D0002 | 000012 | | | 2008-06-11 15:17:35.181786 | | 2 | ノートパソコン | 3 | 2 | 1 | DoLL | INSPIRON | D0003 | 000031 | | | 2008-06-11 15:17:35.188106 | | 2 | ノートパソコン | 4 | 2 | 1 | DoLL | INSPIRON | D0004 | 000400 | | | 2008-06-11 15:17:35.189831 | | 2 | ノートパソコン | 5 | 2 | 1 | DoLL | INSPIRON | D0005 | 000512 | | | 2008-06-11 15:17:35.191721 | | 2 | ノートパソコン | 6 | 1 | 1 | DoLL | VOSTRO | DD001 | 001261 | | | 2008-06-11 15:17:35.193488 | | 2 | ノートパソコン | 7 | 1 | 1 | DoLL | VOSTRO | DD002 | 024714 | | | 2008-06-11 15:17:35.195162 | | 2 | ノートパソコン | 8 | 1 | 1 | DoLL | VOSTRO | DD003 | 004614 | | | 2008-06-11 15:17:35.196896 | | 2 | ノートパソコン | 9 | 1 | 1 | DoLL | VOSTRO | DD004 | 000335 | | | 2008-06-11 15:17:35.198619 | | 2 | ノートパソコン | 10 | 1 | 1 | DoLL | VOSTRO | DD005 | 004812 | | | 2008-06-11 15:17:35.200557 | | 2 | ノートパソコン | 11 | 3 | 1 | oIZO | S2100 | E0001 | 021341 | | | 2008-06-11 15:17:35.202343 | | 2 | ノートパソコン | 12 | 3 | 1 | oIZO | S2100 | E0002 | 002321 | | | 2008-06-11 15:17:35.204004 | | 2 | ノートパソコン | 13 | 3 | 1 | oIZO | S2100 | E0003 | 002324 | | | 2008-06-11 15:17:35.205643 | | 2 | ノートパソコン | 14 | 3 | 1 | oIZO | S2100 | E0004 | 002325 | | | 2008-06-11 15:17:35.207366 | | 2 | ノートパソコン | 15 | 3 | 1 | oIZO | S2100 | E0005 | 002365 | | | 2008-06-11 15:17:35.209097 | | 2 | ノートパソコン | 1 | 2 | 1 | DoLL | INSPIRON | D0001 | 000001 | | | 2008-06-11 15:03:38.175615 | | 3 | ディスプレイ | 2 | 2 | 1 | DoLL | INSPIRON | D0002 | 000012 | | | 2008-06-11 15:17:35.181786 | | 3 | ディスプレイ | 3 | 2 | 1 | DoLL | INSPIRON | D0003 | 000031 | | | 2008-06-11 15:17:35.188106 | | 3 | ディスプレイ | 4 | 2 | 1 | DoLL | INSPIRON | D0004 | 000400 | | | 2008-06-11 15:17:35.189831 | | 3 | ディスプレイ | 5 | 2 | 1 | DoLL | INSPIRON | D0005 | 000512 | | | 2008-06-11 15:17:35.191721 | | 3 | ディスプレイ | 6 | 1 | 1 | DoLL | VOSTRO | DD001 | 001261 | | | 2008-06-11 15:17:35.193488 | | 3 | ディスプレイ | 7 | 1 | 1 | DoLL | VOSTRO | DD002 | 024714 | | | 2008-06-11 15:17:35.195162 | | 3 | ディスプレイ | 8 | 1 | 1 | DoLL | VOSTRO | DD003 | 004614 | | | 2008-06-11 15:17:35.196896 | | 3 | ディスプレイ | 9 | 1 | 1 | DoLL | VOSTRO | DD004 | 000335 | | | 2008-06-11 15:17:35.198619 | | 3 | ディスプレイ | 10 | 1 | 1 | DoLL | VOSTRO | DD005 | 004812 | | | 2008-06-11 15:17:35.200557 | | 3 | ディスプレイ | 11 | 3 | 1 | oIZO | S2100 | E0001 | 021341 | | | 2008-06-11 15:17:35.202343 | | 3 | ディスプレイ | 12 | 3 | 1 | oIZO | S2100 | E0002 | 002321 | | | 2008-06-11 15:17:35.204004 | | 3 | ディスプレイ | 13 | 3 | 1 | oIZO | S2100 | E0003 | 002324 | | | 2008-06-11 15:17:35.205643 | | 3 | ディスプレイ | 14 | 3 | 1 | oIZO | S2100 | E0004 | 002325 | | | 2008-06-11 15:17:35.207366 | | 3 | ディスプレイ | 15 | 3 | 1 | oIZO | S2100 | E0005 | 002365 | | | 2008-06-11 15:17:35.209097 | | 3 | ディスプレイ | 1 | 2 | 1 | DoLL | INSPIRON | D0001 | 000001 | | | 2008-06-11 15:03:38.175615 | | 4 | パッケージソフトウェア | 2 | 2 | 1 | DoLL | INSPIRON | D0002 | 000012 | | | 2008-06-11 15:17:35.181786 | | 4 | パッケージソフトウェア | 3 | 2 | 1 | DoLL | INSPIRON | D0003 | 000031 | | | 2008-06-11 15:17:35.188106 | | 4 | パッケージソフトウェア | 4 | 2 | 1 | DoLL | INSPIRON | D0004 | 000400 | | | 2008-06-11 15:17:35.189831 | | 4 | パッケージソフトウェア | 5 | 2 | 1 | DoLL | INSPIRON | D0005 | 000512 | | | 2008-06-11 15:17:35.191721 | | 4 | パッケージソフトウェア | 6 | 1 | 1 | DoLL | VOSTRO | DD001 | 001261 | | | 2008-06-11 15:17:35.193488 | | 4 | パッケージソフトウェア | 7 | 1 | 1 | DoLL | VOSTRO | DD002 | 024714 | | | 2008-06-11 15:17:35.195162 | | 4 | パッケージソフトウェア | 8 | 1 | 1 | DoLL | VOSTRO | DD003 | 004614 | | | 2008-06-11 15:17:35.196896 | | 4 | パッケージソフトウェア | 9 | 1 | 1 | DoLL | VOSTRO | DD004 | 000335 | | | 2008-06-11 15:17:35.198619 | | 4 | パッケージソフトウェア | 10 | 1 | 1 | DoLL | VOSTRO | DD005 | 004812 | | | 2008-06-11 15:17:35.200557 | | 4 | パッケージソフトウェア | 11 | 3 | 1 | oIZO | S2100 | E0001 | 021341 | | | 2008-06-11 15:17:35.202343 | | 4 | パッケージソフトウェア | 12 | 3 | 1 | oIZO | S2100 | E0002 | 002321 | | | 2008-06-11 15:17:35.204004 | | 4 | パッケージソフトウェア | 13 | 3 | 1 | oIZO | S2100 | E0003 | 002324 | | | 2008-06-11 15:17:35.205643 | | 4 | パッケージソフトウェア | 14 | 3 | 1 | oIZO | S2100 | E0004 | 002325 | | | 2008-06-11 15:17:35.207366 | | 4 | パッケージソフトウェア | 15 | 3 | 1 | oIZO | S2100 | E0005 | 002365 | | | 2008-06-11 15:17:35.209097 | | 4 | パッケージソフトウェア | 1 | 2 | 1 | DoLL | INSPIRON | D0001 | 000001 | | | 2008-06-11 15:03:38.175615 | | 5 | シェアウェア | 2 | 2 | 1 | DoLL | INSPIRON | D0002 | 000012 | | | 2008-06-11 15:17:35.181786 | | 5 | シェアウェア | 3 | 2 | 1 | DoLL | INSPIRON | D0003 | 000031 | | | 2008-06-11 15:17:35.188106 | | 5 | シェアウェア | 4 | 2 | 1 | DoLL | INSPIRON | D0004 | 000400 | | | 2008-06-11 15:17:35.189831 | | 5 | シェアウェア | 5 | 2 | 1 | DoLL | INSPIRON | D0005 | 000512 | | | 2008-06-11 15:17:35.191721 | | 5 | シェアウェア | 6 | 1 | 1 | DoLL | VOSTRO | DD001 | 001261 | | | 2008-06-11 15:17:35.193488 | | 5 | シェアウェア | 7 | 1 | 1 | DoLL | VOSTRO | DD002 | 024714 | | | 2008-06-11 15:17:35.195162 | | 5 | シェアウェア | 8 | 1 | 1 | DoLL | VOSTRO | DD003 | 004614 | | | 2008-06-11 15:17:35.196896 | | 5 | シェアウェア | 9 | 1 | 1 | DoLL | VOSTRO | DD004 | 000335 | | | 2008-06-11 15:17:35.198619 | | 5 | シェアウェア | 10 | 1 | 1 | DoLL | VOSTRO | DD005 | 004812 | | | 2008-06-11 15:17:35.200557 | | 5 | シェアウェア | 11 | 3 | 1 | oIZO | S2100 | E0001 | 021341 | | | 2008-06-11 15:17:35.202343 | | 5 | シェアウェア | 12 | 3 | 1 | oIZO | S2100 | E0002 | 002321 | | | 2008-06-11 15:17:35.204004 | | 5 | シェアウェア | 13 | 3 | 1 | oIZO | S2100 | E0003 | 002324 | | | 2008-06-11 15:17:35.205643 | | 5 | シェアウェア | 14 | 3 | 1 | oIZO | S2100 | E0004 | 002325 | | | 2008-06-11 15:17:35.207366 | | 5 | シェアウェア | 15 | 3 | 1 | oIZO | S2100 | E0005 | 002365 | | | 2008-06-11 15:17:35.209097 | | 5 | シェアウェア | (75 rows) lain=>
元テーブルのレコード一つに対して、結合したレコードの数だけのパターンができるので、普通に掛け算を行ったのと同じ数のレコードが結果として戻ってきます。
詳しいことは後にして、CROSS JOINのもう一つの書き方を見てみましょう。
lain=> Select * From materielmaster,materieldivmaster; materielcode | materieldivcode | materielstatus | materielmaker | modelno | productno | serialno | note1 | note2 | registdate | discarddate | materieldivcode | materieldivname | materieldivnote --------------+-----------------+----------------+---------------+----------+-----------+----------+-------+-------+----------------------------+-------------+-----------------+------------------------+----------------- 1 | 2 | 1 | DoLL | INSPIRON | D0001 | 000001 | | | 2008-06-11 15:03:38.175615 | | 1 | デスクトップパソコン | (中略) (75 rows) lain=>
テーブルをカンマでつなげても同じ意味を示します。
CROSS JOINの場合は、このようにカンマつなぎで書いて省略することが多いので覚えておいてください。
以降の説明でも基本的に省略方式にします。
結合したとしても、問題なくWhereやOrder Byを使用することができます。
materielmakerが、DoLLのものだけ表示、並び順もmaterielcodeの順で並べてみます。
lain=> Select * From materielmaster,materieldivmaster lain-> Where materielmaker='DoLL' lain-> Order by materielcode; materielcode | materieldivcode | materielstatus | materielmaker | modelno | productno | serialno | note1 | note2 | registdate | discarddate | materieldivcode | materieldivname | materieldivnote --------------+-----------------+----------------+---------------+----------+-----------+----------+-------+-------+----------------------------+-------------+-----------------+------------------------+----------------- 1 | 2 | 1 | DoLL | INSPIRON | D0001 | 000001 | | | 2008-06-11 15:03:38.175615 | | 1 | デスクトップパソコン | 1 | 2 | 1 | DoLL | INSPIRON | D0001 | 000001 | | | 2008-06-11 15:03:38.175615 | | 2 | ノートパソコン | 1 | 2 | 1 | DoLL | INSPIRON | D0001 | 000001 | | | 2008-06-11 15:03:38.175615 | | 3 | ディスプレイ | 1 | 2 | 1 | DoLL | INSPIRON | D0001 | 000001 | | | 2008-06-11 15:03:38.175615 | | 4 | パッケージソフトウェア | 1 | 2 | 1 | DoLL | INSPIRON | D0001 | 000001 | | | 2008-06-11 15:03:38.175615 | | 5 | シェアウェア | 2 | 2 | 1 | DoLL | INSPIRON | D0002 | 000012 | | | 2008-06-11 15:17:35.181786 | | 1 | デスクトップパソコン | 2 | 2 | 1 | DoLL | INSPIRON | D0002 | 000012 | | | 2008-06-11 15:17:35.181786 | | 2 | ノートパソコン | 2 | 2 | 1 | DoLL | INSPIRON | D0002 | 000012 | | | 2008-06-11 15:17:35.181786 | | 3 | ディスプレイ | 2 | 2 | 1 | DoLL | INSPIRON | D0002 | 000012 | | | 2008-06-11 15:17:35.181786 | | 4 | パッケージソフトウェア | 2 | 2 | 1 | DoLL | INSPIRON | D0002 | 000012 | | | 2008-06-11 15:17:35.181786 | | 5 | シェアウェア | 3 | 2 | 1 | DoLL | INSPIRON | D0003 | 000031 | | | 2008-06-11 15:17:35.188106 | | 1 | デスクトップパソコン | 3 | 2 | 1 | DoLL | INSPIRON | D0003 | 000031 | | | 2008-06-11 15:17:35.188106 | | 2 | ノートパソコン | 3 | 2 | 1 | DoLL | INSPIRON | D0003 | 000031 | | | 2008-06-11 15:17:35.188106 | | 3 | ディスプレイ | 3 | 2 | 1 | DoLL | INSPIRON | D0003 | 000031 | | | 2008-06-11 15:17:35.188106 | | 4 | パッケージソフトウェア | 3 | 2 | 1 | DoLL | INSPIRON | D0003 | 000031 | | | 2008-06-11 15:17:35.188106 | | 5 | シェアウェア | 4 | 2 | 1 | DoLL | INSPIRON | D0004 | 000400 | | | 2008-06-11 15:17:35.189831 | | 1 | デスクトップパソコン | 4 | 2 | 1 | DoLL | INSPIRON | D0004 | 000400 | | | 2008-06-11 15:17:35.189831 | | 2 | ノートパソコン | 4 | 2 | 1 | DoLL | INSPIRON | D0004 | 000400 | | | 2008-06-11 15:17:35.189831 | | 3 | ディスプレイ | 4 | 2 | 1 | DoLL | INSPIRON | D0004 | 000400 | | | 2008-06-11 15:17:35.189831 | | 4 | パッケージソフトウェア | 4 | 2 | 1 | DoLL | INSPIRON | D0004 | 000400 | | | 2008-06-11 15:17:35.189831 | | 5 | シェアウェア | 5 | 2 | 1 | DoLL | INSPIRON | D0005 | 000512 | | | 2008-06-11 15:17:35.191721 | | 1 | デスクトップパソコン | 5 | 2 | 1 | DoLL | INSPIRON | D0005 | 000512 | | | 2008-06-11 15:17:35.191721 | | 2 | ノートパソコン | 5 | 2 | 1 | DoLL | INSPIRON | D0005 | 000512 | | | 2008-06-11 15:17:35.191721 | | 3 | ディスプレイ | 5 | 2 | 1 | DoLL | INSPIRON | D0005 | 000512 | | | 2008-06-11 15:17:35.191721 | | 4 | パッケージソフトウェア | 5 | 2 | 1 | DoLL | INSPIRON | D0005 | 000512 | | | 2008-06-11 15:17:35.191721 | | 5 | シェアウェア | 6 | 1 | 1 | DoLL | VOSTRO | DD001 | 001261 | | | 2008-06-11 15:17:35.193488 | | 1 | デスクトップパソコン | 6 | 1 | 1 | DoLL | VOSTRO | DD001 | 001261 | | | 2008-06-11 15:17:35.193488 | | 2 | ノートパソコン | 6 | 1 | 1 | DoLL | VOSTRO | DD001 | 001261 | | | 2008-06-11 15:17:35.193488 | | 3 | ディスプレイ | 6 | 1 | 1 | DoLL | VOSTRO | DD001 | 001261 | | | 2008-06-11 15:17:35.193488 | | 4 | パッケージソフトウェア | 6 | 1 | 1 | DoLL | VOSTRO | DD001 | 001261 | | | 2008-06-11 15:17:35.193488 | | 5 | シェアウェア | 7 | 1 | 1 | DoLL | VOSTRO | DD002 | 024714 | | | 2008-06-11 15:17:35.195162 | | 1 | デスクトップパソコン | 7 | 1 | 1 | DoLL | VOSTRO | DD002 | 024714 | | | 2008-06-11 15:17:35.195162 | | 2 | ノートパソコン | 7 | 1 | 1 | DoLL | VOSTRO | DD002 | 024714 | | | 2008-06-11 15:17:35.195162 | | 3 | ディスプレイ | 7 | 1 | 1 | DoLL | VOSTRO | DD002 | 024714 | | | 2008-06-11 15:17:35.195162 | | 4 | パッケージソフトウェア | 7 | 1 | 1 | DoLL | VOSTRO | DD002 | 024714 | | | 2008-06-11 15:17:35.195162 | | 5 | シェアウェア | 8 | 1 | 1 | DoLL | VOSTRO | DD003 | 004614 | | | 2008-06-11 15:17:35.196896 | | 1 | デスクトップパソコン | 8 | 1 | 1 | DoLL | VOSTRO | DD003 | 004614 | | | 2008-06-11 15:17:35.196896 | | 2 | ノートパソコン | 8 | 1 | 1 | DoLL | VOSTRO | DD003 | 004614 | | | 2008-06-11 15:17:35.196896 | | 3 | ディスプレイ | 8 | 1 | 1 | DoLL | VOSTRO | DD003 | 004614 | | | 2008-06-11 15:17:35.196896 | | 4 | パッケージソフトウェア | 8 | 1 | 1 | DoLL | VOSTRO | DD003 | 004614 | | | 2008-06-11 15:17:35.196896 | | 5 | シェアウェア | 9 | 1 | 1 | DoLL | VOSTRO | DD004 | 000335 | | | 2008-06-11 15:17:35.198619 | | 1 | デスクトップパソコン | 9 | 1 | 1 | DoLL | VOSTRO | DD004 | 000335 | | | 2008-06-11 15:17:35.198619 | | 2 | ノートパソコン | 9 | 1 | 1 | DoLL | VOSTRO | DD004 | 000335 | | | 2008-06-11 15:17:35.198619 | | 3 | ディスプレイ | 9 | 1 | 1 | DoLL | VOSTRO | DD004 | 000335 | | | 2008-06-11 15:17:35.198619 | | 4 | パッケージソフトウェア | 9 | 1 | 1 | DoLL | VOSTRO | DD004 | 000335 | | | 2008-06-11 15:17:35.198619 | | 5 | シェアウェア | 10 | 1 | 1 | DoLL | VOSTRO | DD005 | 004812 | | | 2008-06-11 15:17:35.200557 | | 1 | デスクトップパソコン | 10 | 1 | 1 | DoLL | VOSTRO | DD005 | 004812 | | | 2008-06-11 15:17:35.200557 | | 2 | ノートパソコン | 10 | 1 | 1 | DoLL | VOSTRO | DD005 | 004812 | | | 2008-06-11 15:17:35.200557 | | 3 | ディスプレイ | 10 | 1 | 1 | DoLL | VOSTRO | DD005 | 004812 | | | 2008-06-11 15:17:35.200557 | | 4 | パッケージソフトウェア | 10 | 1 | 1 | DoLL | VOSTRO | DD005 | 004812 | | | 2008-06-11 15:17:35.200557 | | 5 | シェアウェア | (50 rows) lain=>
さて、このような表示をされても困ってしまいます。
普通は二つのテーブルに存在するmaterieldivcodeが同じものだけ表示されれば十分だと思います。
「一致する場合だけ表示」というのは、Whereで条件を与えればできるのではないか?と言うことで試してみましょう。
lain=> Select * From materielmaster,materieldivmaster lain-> Where materieldivcode=materieldivcode lain-> Order by materielcode; ERROR: column reference "materieldivcode" is ambiguous lain=>
エラーになります。Whereでフィールドが一致するものという意味で書いているのですが、どのテーブルのフィールドかわからないためです。
というわけで、きちんとしたSQLの書き方にしたがって、テーブル名を付けて書き直してみます。
lain=> Select * From materielmaster,materieldivmaster lain-> Where materielmaster.materieldivcode=materieldivmaster.materieldivcode lain-> Order by materielcode; materielcode | materieldivcode | materielstatus | materielmaker | modelno | productno | serialno | note1 | note2 | registdate | discarddate | materieldivcode | materieldivname | materieldivnote --------------+-----------------+----------------+---------------+----------+-----------+----------+-------+-------+----------------------------+-------------+-----------------+----------------------+----------------- 1 | 2 | 1 | DoLL | INSPIRON | D0001 | 000001 | | | 2008-06-11 15:03:38.175615 | | 1 | デスクトップパソコン | 2 | 2 | 1 | DoLL | INSPIRON | D0002 | 000012 | | | 2008-06-11 15:17:35.181786 | | 2 | ノートパソコン | 3 | 2 | 1 | DoLL | INSPIRON | D0003 | 000031 | | | 2008-06-11 15:17:35.188106 | | 2 | ノートパソコン | 4 | 2 | 1 | DoLL | INSPIRON | D0004 | 000400 | | | 2008-06-11 15:17:35.189831 | | 2 | ノートパソコン | 5 | 2 | 1 | DoLL | INSPIRON | D0005 | 000512 | | | 2008-06-11 15:17:35.191721 | | 2 | ノートパソコン | 6 | 1 | 1 | DoLL | VOSTRO | DD001 | 001261 | | | 2008-06-11 15:17:35.193488 | | 1 | デスクトップパソコン | 7 | 1 | 1 | DoLL | VOSTRO | DD002 | 024714 | | | 2008-06-11 15:17:35.195162 | | 1 | デスクトップパソコン | 8 | 1 | 1 | DoLL | VOSTRO | DD003 | 004614 | | | 2008-06-11 15:17:35.196896 | | 1 | デスクトップパソコン | 9 | 1 | 1 | DoLL | VOSTRO | DD004 | 000335 | | | 2008-06-11 15:17:35.198619 | | 1 | デスクトップパソコン | 10 | 1 | 1 | DoLL | VOSTRO | DD005 | 004812 | | | 2008-06-11 15:17:35.200557 | | 1 | デスクトップパソコン | 11 | 3 | 1 | oIZO | S2100 | E0001 | 021341 | | | 2008-06-11 15:17:35.202343 | | 3 | ディスプレイ | 12 | 3 | 1 | oIZO | S2100 | E0002 | 002321 | | | 2008-06-11 15:17:35.204004 | | 3 | ディスプレイ | 13 | 3 | 1 | oIZO | S2100 | E0003 | 002324 | | | 2008-06-11 15:17:35.205643 | | 3 | ディスプレイ | 14 | 3 | 1 | oIZO | S2100 | E0004 | 002325 | | | 2008-06-11 15:17:35.207366 | | 3 | ディスプレイ | 15 | 3 | 1 | oIZO | S2100 | E0005 | 002365 | | | 2008-06-11 15:17:35.209097 | | 3 | ディスプレイ | (15 rows) lain=>
今度は表示されました。
とはいえ、横に長くて何がなんだかわからないので、必要な情報だけ表示するように変えてみましょう。
とりあえず、materielcode、materieldivcode、materieldivname、materielmaker、modelno、productno、serialnoがあればよいでしょうか。
lain=> Select materielcode,materieldivcode,materieldivname,materielmaker,modelno,productno,serialno lain-> From materielmaster,materieldivmaster lain-> Where materielmaster.materieldivcode=materieldivmaster.materieldivcode lain-> Order by materielcode; ERROR: column reference "materieldivcode" is ambiguous lain=>
先ほどのエラーと同じです。Select句で選択したフィールド名が一致しているので、どちらのを表示すればいい?って事になっています。
なので、Whereでやったように、Selectのほうにもテーブル指定を追加してみます。
lain=> Select materielcode,materielmaster.materieldivcode,materieldivname, lain-> materielmaker,modelno,productno,serialno lain-> From materielmaster,materieldivmaster lain-> Where materielmaster.materieldivcode=materieldivmaster.materieldivcode lain-> Order by materielcode; materielcode | materieldivcode | materieldivname | materielmaker | modelno | productno | serialno --------------+-----------------+----------------------+---------------+----------+-----------+---------- 1 | 2 | デスクトップパソコン | DoLL | INSPIRON | D0001 | 000001 2 | 2 | ノートパソコン | DoLL | INSPIRON | D0002 | 000012 3 | 2 | ノートパソコン | DoLL | INSPIRON | D0003 | 000031 4 | 2 | ノートパソコン | DoLL | INSPIRON | D0004 | 000400 5 | 2 | ノートパソコン | DoLL | INSPIRON | D0005 | 000512 6 | 1 | デスクトップパソコン | DoLL | VOSTRO | DD001 | 001261 7 | 1 | デスクトップパソコン | DoLL | VOSTRO | DD002 | 024714 8 | 1 | デスクトップパソコン | DoLL | VOSTRO | DD003 | 004614 9 | 1 | デスクトップパソコン | DoLL | VOSTRO | DD004 | 000335 10 | 1 | デスクトップパソコン | DoLL | VOSTRO | DD005 | 004812 11 | 3 | ディスプレイ | oIZO | S2100 | E0001 | 021341 12 | 3 | ディスプレイ | oIZO | S2100 | E0002 | 002321 13 | 3 | ディスプレイ | oIZO | S2100 | E0003 | 002324 14 | 3 | ディスプレイ | oIZO | S2100 | E0004 | 002325 15 | 3 | ディスプレイ | oIZO | S2100 | E0005 | 002365 (15 rows) lain=>
本当は全てのフィールドに対してテーブル指定を付けるのが正しいのですが、大変なので必要な部分だけに限定しています。
さて、今回はここまでとします。
なお、一番最後の例の場合、この次の説明で使用する、Inner Joinを使用するのが一般的だと思います。
理由なども含めて次回へ。