- ベストアンサー
SQLで他のテーブルの項目を参照する方法
SQLでは表の中で他の項目を参照することは出来るでしょうか。 具体的にやりたいのは例えば次のようなことです。 得意先リストのデータベースの中に、 (得意先ID,住所,担当者名,TEL,FAX)というフィールドからなる「商品発送先」というテーブルを作ります。 もうひとつ別に、 (得意先ID,住所,担当者名,TEL,FAX)というフィールドを持つ「請求書発送先」というテーブルも作ります。 同じ得意先でも2つの発送先の担当者名だけが違ったり、住所も違ったりする場合があるからです。 しかし大部分の場合は同じなので、そういう場合に両方のテーブルに同じ値を書くとメモリーの無駄ですし、変更があったときに両方を修正しなければなりません。 そこで、例えば「請求書発送先」の"住所"が「商品発送先」の"住所"と同じであれば、その項目には同じ住所を書く替わりに"商品発送先に同じ"とか(あるいはそれを意味するなんらかのコード)を記入しておき、select文などでデータを出力する際に、"商品発送先に同じ"という記述を見つけたら「商品発送先」テーブルの対応する項目の内容を出力する。 というようなことはできないでしょうか。 もちろんデータベースの操作にPHPなどを使ってプログラムを組めばそういうことは簡単に出来ますが、SQLだけでそういうことができる方法があるかどうか知りたいのです。 あるいは、そういうことをしたいのならデータ構造をこういう風に変えた方がいい、というアドバイスでも結構です。 よろしくおねがいします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
SQLにIF文のようなCASE文が使えますので それを使えば下記のように実現できます。 seikyusho_souhusaki_flg が1の場合は配送先 それ以外の場合は請求先を請求書送付先住所として 出力します。 #内容は保証できませんが、参考程度に・・・ create table haisousaki ( tokuisaki_id int, address char(128), tantou char(64), tel char(20), fax char(20) ); create table seikyusho ( tokuisaki_id int, address char(128), tantou char(64), tel char(20), fax char(20) ); create table uriage ( tokuisaki_id int, uriagebi date, uri_shouhin_id int, seikyusho_souhusaki_flg bool ) insert into haisousaki values ( 1, "東京都中央区1-1-1","山田", "01234567","01234567"); insert into seikyusho values ( 1, "大阪市中央区222","鈴木", "01234567","01234567"); insert into uriage values ( 1, "2004-12-01", 1,1); insert into uriage values ( 1, "2004-12-02", 1,0); select u.uriagebi,h.address, s.address from uriage u left join haisousaki h on ( u.tokuisaki_id = h.tokuisaki_id) left join seikyusho s on ( u.tokuisaki_id = s.tokuisaki_id) select u.uriagebi, case when u.seikyusho_souhusaki_flg = 1 then h.address else s.address end as seikyusho_sohusaki_jyusho from uriage u left join haisousaki h on ( u.tokuisaki_id = h.tokuisaki_id) left join seikyusho s on ( u.tokuisaki_id = s.tokuisaki_id) #ただ力業なのでテーブル設計を考えた方がいいかも。
その他の回答 (1)
私なら、商品発送先テーブルを変更します。 テーブル名を「発送先」テーブルとし、項目をひとつ追加します。 追加する項目は、商品と請求書のどちらの発送先であるかを記述する項目で、 たとえば、0→両方 1→商品 2→請求書 のようにします。 請求書を送るための発送先を取得したい場合は、 追加した項目が「0 or 2」という条件で取得すれば 希望のものが取れると思います。
お礼
ありがとうございます。 参考にさせて頂きます。
お礼
なるほど! ありがとうございます。 この方法をヒントにすればやりたいことができそうです。 が、私が使っているのはMySQL4.3.8です。 確か、MySQLでストアドプロシージャが使えるのは5.0以降だったと思うのですが、教えて頂いたSQLをそのまま打ち込んでみるとエラーも出ずに実行できました。 CASE文はストアドプロシージャとは関係ないのでしょうか。