• ベストアンサー

SQLで他のテーブルの項目を参照する方法

SQLでは表の中で他の項目を参照することは出来るでしょうか。 具体的にやりたいのは例えば次のようなことです。 得意先リストのデータベースの中に、 (得意先ID,住所,担当者名,TEL,FAX)というフィールドからなる「商品発送先」というテーブルを作ります。 もうひとつ別に、 (得意先ID,住所,担当者名,TEL,FAX)というフィールドを持つ「請求書発送先」というテーブルも作ります。 同じ得意先でも2つの発送先の担当者名だけが違ったり、住所も違ったりする場合があるからです。 しかし大部分の場合は同じなので、そういう場合に両方のテーブルに同じ値を書くとメモリーの無駄ですし、変更があったときに両方を修正しなければなりません。 そこで、例えば「請求書発送先」の"住所"が「商品発送先」の"住所"と同じであれば、その項目には同じ住所を書く替わりに"商品発送先に同じ"とか(あるいはそれを意味するなんらかのコード)を記入しておき、select文などでデータを出力する際に、"商品発送先に同じ"という記述を見つけたら「商品発送先」テーブルの対応する項目の内容を出力する。 というようなことはできないでしょうか。 もちろんデータベースの操作にPHPなどを使ってプログラムを組めばそういうことは簡単に出来ますが、SQLだけでそういうことができる方法があるかどうか知りたいのです。 あるいは、そういうことをしたいのならデータ構造をこういう風に変えた方がいい、というアドバイスでも結構です。 よろしくおねがいします。

  • MySQL
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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) #ただ力業なのでテーブル設計を考えた方がいいかも。

参考URL:
http://dev.mysql.com/doc/mysql/ja/Control_flow_functions.html
horagai
質問者

お礼

なるほど! ありがとうございます。 この方法をヒントにすればやりたいことができそうです。 が、私が使っているのはMySQL4.3.8です。 確か、MySQLでストアドプロシージャが使えるのは5.0以降だったと思うのですが、教えて頂いたSQLをそのまま打ち込んでみるとエラーも出ずに実行できました。 CASE文はストアドプロシージャとは関係ないのでしょうか。

その他の回答 (1)

noname#10047
noname#10047
回答No.1

私なら、商品発送先テーブルを変更します。 テーブル名を「発送先」テーブルとし、項目をひとつ追加します。 追加する項目は、商品と請求書のどちらの発送先であるかを記述する項目で、 たとえば、0→両方 1→商品 2→請求書 のようにします。 請求書を送るための発送先を取得したい場合は、 追加した項目が「0 or 2」という条件で取得すれば 希望のものが取れると思います。

horagai
質問者

お礼

ありがとうございます。 参考にさせて頂きます。

関連するQ&A

  • 参照整合性の規則に違反しています。

     http://okwave.jp/qa/q8426435.htmlの質問に続きですが  恥ずかしながら、まだ解決に至っていません。問題が発生して年を越してしまいました。  サンプル問題Accessファイルは以上のURLからとれますので、興味の有られる方は  どうぞ、参考にされてください。  それで、  以下を追加しました。    T得意先マスター:テーブルのフィールド名は 得意先CD  得意先名 フリガナ  〒  住所1  住所2 TEL  担当者CD  DM  の9フィールドです。   T売上げデータ:テーブルのフィールド名は   NO  売上日  得意先CD  数量  の4フィールドです。    以上宜しくお願いいたします。

  • テーブル設計で、項目名の付け方について迷っています。

    テーブル設計で、項目名の付け方について迷っています。 いつもお世話になっております。 仕事で初めてテーブル設計を任されました。 今はマスタの設計をしています。 そこで、一つ質問があります。 得意先マスタと会員マスタがあって、両方のテーブルに 住所、電話番号があるのですが、この場合は普通、 S_TOKUI_ADDとS_KAIIN_ADD C_TOKUI_TELとC_KAIIN_TEL といった具合に、名前を変えるのが一般的でしょうか。 それとも、テーブルが違うんだから気にせずに S_ADDRESS、C_TELと同じ名前を付けるのが一般的でしょうか。 よろしくお願い致します。

  • ACCESSでテーブルでの自動入力

    ACCESS 2007を使っています。 SQLとかは分かりません。(貼り付けとかも、そもそもどこに貼り付けるのかもよく分かりません) 得意先(100件)を、営業担当者(5人)にそれぞれに割り振ります。 得意先テーブル(得意先ID、名前、住所、担当者ID、営業担当者名)(とりあえずは、営業担当者名だけは空白) 営業担当者テーブル(担当者ID、営業担当者名)を 作成します。 クエリのほうで、以下の二つのテーブルの以下の要素を合体させたものを作ります。 得意先テーブルの(得意先ID、名前、住所、担当者ID) 営業担当者テーブルから(営業担当者名) すると、 得意先クエリ(得意先ID、名前、住所、担当者ID、営業担当者名)まで入ったもの、がつくれます。このクエリは、得意先ID、担当者ID両方がきちんと入力された項目のみがリストアップされます。 それで、以下疑問点なのですが、 ・基本的に、得意先の情報を新規で入力していく際は、この得意先クエリをベースに作成された、得意先フォームから入力していくというのが一般的なのでしょうか。 (テーブル自体に、上記の得意先テーブルに、得意先名まで入ったものを作成することは普通は、しないのでしょうか。入っていた方が何かと便利かと思うのですが、そういった用途には、クエリを基にしたフォームを使うものなのか。あくまでテーブルはデータの保管場所と考え、クエリを使用上の入出力の基本窓口にすべきなのでしょうか) ・現段階で、上記の得意先テーブルで、担当者IDが入力されていないものが多数あるのですが、(エクセルで取り込んだデータ)、この得意先クエリでは、それらは表示されません。そうすると、得意先テーブルから入力していく必要があります。その場合は、得意先テーブル自体か、そこから作られたフォームに、担当者ID(実際にはこれが、代理店IDで、結構多数あるのですが)、を入力していく形になるかと思います。この場合、得意先テーブルだけをベースとしたクエリやフォームをつくり、担当者IDの入力を(入力しやすい形、自動的に選択できるなど)にして、入力をとりあえず終えきるというのは基本でしょうか。 とりとめもない質問になってしまいましたが、よろしくおねがいします。 基本的な考え方など分かればと思います。

  • Accessでクエリを作った際の順番

    Access2003の質問です。 以下のテーブルがあってそれらの項目を抜き出してクエリを作っています。 テーブル1 ・商品CD ・商品名 ・単価 テーブル2 ・No ・売上日 ・得意先CD ・商品CD ・数量 テーブル3 ・得意先CD ・得意先名 ・フリガナ ・郵便番号 ・住所 ・TEL ・担当者CD ・DM テーブル4 ・担当者CD ・担当者名 クエリ ・No(テーブル2) ・売上日(テーブル2) ・得意先CD(テーブル2) ・得意先名(テーブル3) ・担当者CD(テーブル3) ・担当者名(テーブル4) ・商品CD(テーブル2) ・商品名(テーブル1) ・単価(テーブル1) ・数量(テーブル2) クエリを作って、データシートビューに切り替えるとなぜか得意先CDで昇順に並んでいます。 もちろんNoで並べ替えを設定すれば、Noで並べ替わるのですが、なぜ得意先CDで昇順に並ぶのでしょうか? Noが一番左にあるので、Noで並べ替わりそうなものですが・・ 何も並べ替えを設定しないとどのような基準で並ぶのでしょうか? わかる方がいれば教えてください。

  • SQLを使って他のテーブルから更新したいのですが

    状況説明 テーブル:顧客→マスターファイルで住所や電話がブランク テーブル:NewTable→住所や電話番号でデータを持っている NewTableの内容を顧客テーブルに更新したい SQL→ UPDATE 顧客 INNER JOIN NewTable ON 顧客.店舗名 = NewTable.店舗名 SET 顧客.客室数 = NewTable.客室数, 顧客.郵便番号 = NewTable.郵便番号, 顧客.都道府県 = NewTable.住所, 顧客.店電話 = NewTable.電話番号, 顧客.店FAX = NewTable.FAX NO, 顧客.オープン日 = NewTable.オープン日; 実行方法→ これが正しいかどうか分からないのですが、 モジュールのオブジェクトを選んで 新規作成を選ぶとVBモードになります。 ここでイミディエイト画面を出して 上記のSQLをそのまま入れ、 実行のため、Enterキーをたたいたら エラーが発生→ コンパイラエラー 修正候補:ステートメントの最後 と出ました。 質問→ そもそもSQLの実行をイミディエイト画面からでいいのかも わかりません 何かアドバイスいただけますでしょうか

  • クエリ作成でどちらのフィールドが正解ですか

    Access初心者です。 Access2010の学習をしています。 主キーと外部キーで関連付けられた フィールドをクエリで抽出する場合、 デザイングリッドにドラッグするフィールドは、 どちらのフィールドを選べばよいのでしょうか? ---- 「T担当者マスタ」と「T得意先マスタ」をもとに 「Q得意先マスタ」を作成したい場合です・・・ 「T担当者マスタ」のフィールド 担当者コード(主キー) 担当者名 「T得意先マスタ」のフィールド 得意先コード(主キー) 得意先名 フリガナ 〒 住所 TEL 担当者コード(外部キー) 担当者名 デザイングリッドにドラッグするフィールド 得意先コード 得意先名 フリガナ 〒 住所 TEL 担当者コード(※主キーのフィールドを選ぶのは不正解ですか?) 担当者名 ----- 担当者コードは元となるテーブルの両方に存在する わけですが、どんな理由でどちらを選ぶのか 理解できません。 テキストの問題なのに情けないです・・ ご教授ください。

  • テーブル内のレコードを別のテーブルに移す良い方法を教えてください

    SQLサーバー7.0(ADO)とAccess97のVBAでアプリケーションの開発を行っております。SQLサーバー7.0(サーバー側)にあるテーブルの中身(レコード全件)をAccess97(ローカル)にあるテーブル(テーブル名とその中のフィールド名は全く同じだが中身はからっぽ)にまとめて移しかえる良い方法があれば教えてください。いま私はフォームオープンイベントでフィールドとレコードをループでまわして移しかえているのですが、テーブル数も多いため記述も長くなりますし、何よりもパフォーマンスが良くありません。テーブル単位で中身を別のテーブルに移す方法などがあれば是非教えてください。 (例) SQLサーバー(ホスト側)---テーブル名「T_社員マスター」フィールド数100項目、レコード数500件 ↓ ↓ フォームオープン時にそのまま移しかえたい ↓ ↓ Access97(端末側)-------テーブル名「T_社員マスター」フィールド数100項目、レコード数0件 よろしくお願いします。

  • 他テーブルで一致する列から名称を取得したい(SQL文)

    SQL文の作成方法が分からず困っています。 以下の実現はどのように行えばよろしいでしょうか? --------------------- テーブルA:(項目)キー番号、項目No テーブルB:(項目)キー番号、項目No1、項目No1名称、 項目No2、項目No2名称、項目No3、項目No3名称 --------------------- とします。 ここで、テーブルA、Bでキー番号が一致し、 テーブルAの項目Noで、テーブルBの項目No1~3のどれかと 一致した場合、項目名称をテーブルBより取ってきたいです。 出力する時、項目No、項目名称は1個のみ出力したいです。 項目No1~3にない場合も名称空白でそのまま出力します。 (データ例) テーブルA: 100,1 100,4 110,5 テーブルB: 100,1,項目名1,2,項目名2,3,項目名3 110,3,項目名3,4,項目名4,5,項目名5 結果: 100,1,項目名1 100,4,(空白) 110,5,項目名5

  • 一つのSQLで実行する方法

    SQL初心者です。以下のような商品テーブルの備考欄の文字列をアップデートするSQLですが、ひとつのSQL文で実行させるにはどのように記述すれば良いかお教えいただけませんでしょうか? UPDATE 商品テーブル SET 備考フィールド = replace(備考フィールド,'%明太子味',''); UPDATE 商品テーブル SET 備考フィールド = replace(備考フィールド,'のり味',''); UPDATE 商品テーブル SET 備考フィールド = replace(備考フィールド,'みそ味','');

  • VIEWでテーブルの集計結果を表示したいです

    いつもお世話になっています。 下のテーブルデータから下記VIEW結果を表示する場合、 どのようなSQL文で出力が可能になるのでしょうか。 ※GROUP BY利用では集計値でない商品名、得意先名を出力できず困っています。 初心者的な質問で申し訳ありませんが、ご回答よろしくお願いします。 ○環境:Windows Server 2003、 SQLServer 2005 ------------------------------------------- 「売上明細テーブル」 商品CD 商品名 得意先CD 得意先名 価格 1 商品1 1001 得意先1 100 1 商品1 1001 得意先1 100 1 商品1 2002 得意先2 100 2 商品2 2002 得意先2 200 2 商品2 3003 得意先3 200 2 商品2 3003 得意先3 200 ------------------------------------------- 「VIEW結果」※価格は商品CD+得意先CDキーの合計値です。 商品CD 商品名 得意先CD 得意先名 価格(合計) 1 商品1 1001 得意先1 200 1 商品1 2002 得意先2 100 2 商品2 2002 得意先2 200 2 商品2 3003 得意先3 400