• ベストアンサー

3つのテーブルの結合

access2000にて作業しています。 下記のようなテーブルが3つあります。 [納品T] 年月日|顧客番号|品名|数量 [品名マスタ] 顧客番号|品名 [顧客マスタ] ID|顧客名 納品クエリを作り デザイン画面で [納品T]品名と[品名マスタ]品名を結び [納品T]顧客番号[顧客マスタ]IDを結んで クエリを表示すると、[納品T]のレコードより少なくなってしまします。 その原因は、別の顧客で品名が同一なものがあることが原因と思うのですが、[納品T]と納品クエリのレコード数を一致させるには、SQLはどのように書けばいいのでしょうか。

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

  • ベストアンサー
  • Mizyu
  • ベストアンサー率41% (245/593)
回答No.1

レコードが少なくなるということは > 別の顧客で品名が同一なものがあることが原因 ではなく、 納品Tの品名に品名マスタにないものも含んでいる もしくは納品Tの顧客番号に顧客マスタにないものを含んでいるのではないでしょうか? SELECT 納品T.* FROM 品名マスタ RIGHT JOIN (顧客マスタ RIGHT JOIN 納品T ON 顧客マスタ.ID = 納品T.顧客番号) ON 品名マスタ.品名 = 納品T.品名; これでどうでしょうか?

s-holmes
質問者

お礼

回答ありがとうございました。 未解決ですが、あまりに初心者のため、今後の課題にさせていただきます。

その他の回答 (1)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

No.1さんの回答されている通りなのですが、 デザイン画面上でこれを行うには、 テーブル同士を結んでいる線の上でマウスの 左ボタンをダブルクリックします。 すると、結合の仕方を選択する画面が現れますから、 「納品T」テーブルのすべてのデータを表示するよう 設定します。

s-holmes
質問者

お礼

回答ありがとうございました。 未解決ですが、あまりに初心者のため、今後の課題にさせていただきます。

関連するQ&A

  • Access2002で任意のレコードのみをレポートで印刷したい

    http://oshiete1.goo.ne.jp/qa5272888.html の続きです。 テーブルは下記のとおりです。(計4つ) 1.顧客テーブル(データ投入済み) ・顧客ID(テキスト) ・顧客名(テキスト) ・フリガナ(テキスト) 2.納品書テーブル(データはフォームから自動生成) ・納品書ID(オートナンバー) ・納品日付(日付) ・顧客ID(テキスト) 3.注文テーブル(データ投入済み) ・注文ID(テキスト) ・顧客ID(テキスト) ・納品書ID(テキスト) ・数量(数値) ・摘要(テキスト) ・選択(Yes/No) 4.商品マスター(データ投入済み) ・商品ID(テキスト) ・商品名(テキスト) ・単価(数値) 以上の4つのテーブルでテストDBを作っています。 上述したとおり、フォームで、 1.新規レコードの作製 2.納品日付入力 3.コンボボックス(従業員名、カナ)をコンボボックスで選択 という手順を踏み、納品書番号が自動的に振られるフォームまで作成できました。 これを元に、レポートとして、 ・顧客を選択 ・納品書番号を選択 して、選択したレコードをレポートに表示したい、という質問です。 前の質問で、下記ご回答を得ております。 --------------------------------------------------------------- 1.納品書の一覧 以前作成した「納品書番号」のレコードソースを SELECT 納品書テーブル.納品書ID, 納品書テーブル.納品日付, 納品書テーブル.顧客ID FROM 納品書テーブル ORDER BY 納品書テーブル.納品書ID DESC; に変更して、新しいものが先に見えるようにします 2.フォームのプロパティで「データ」の「追加の許可」を「いいえ」にします。 3.ウィザードが起動したら「フォームの操作」「フォームを開く」と進み、「納品書番号(選択)」を開くようにします。これでいつでも新規納品書を作成できます 4.「納品書番号」フォームのイベントで「アクティブ時」を「[イベント プロシージャ]」にし編集ボタン(…)を押して、以下のようにします Private Sub Form_Activate() Me.Requery End Sub これで新規納品書作成後に「納品書番号(選択)」を閉じると、最新の納品書が表示されます 5.レポート「納品書」の作成 レコードソースは SELECT 納品書テーブル.納品書ID, 納品書テーブル.納品日付, 従業員マスタ.従業員名 FROM 従業員マスタ INNER JOIN 納品書テーブル ON 従業員マスタ.従業員ID = 納品書テーブル.顧客ID WHERE (((納品書テーブル.納品書ID)=[Forms]![納品書番号]![納品書ID])); 6.レポートにフィールドリストから「納品書ID」「従業員名」などを貼り付けます 7.「納品書番号」をデザインモードで開き、ボタンを追加し「納品書」レポートをプレビューで開くようにします。これで任意の納品書が印刷できるようになります 8.実際のレポートは納品書番号に対応するアイテムが並ぶ必要がありますが、これはレコードソース(クエリ)を拡張することでもできるし、親子レポートにすることでも可能です。色々試してください --------------------------------------------------------------- fuuten_no_nekoさん、ありがとうございました。 これまでは「フォーム」に関する質問で、今回は「レポート」に関するものに進んできましたので、新規の質問にしたほうがよいとのアドバイスを受け、この質問を立ち上げます。 なお、「今ここまでできている」という部分は、補足に記述します。 どうぞよろしくお願いします。

  • access テーブル結合の逆?

    Access2003 お世話になります。SQLで以下のようなデータを取得する場合、上手い方法はあるのでしょうか。なんだかとても簡単な事のような気がするのですが…… テーブルA: ---品名--- りんご みかん もも いちご テーブルB: ---品名--- りんご もも このテーブルBに入力されているレコードをテーブルAから"除外"して、結果として「みかん」と「いちご」だけが欲しいのです。 テーブルBのレコードが少なければ、直接 品名<>"りんご" とか書いてもいいのかもしれませんが、結合のようなSQLで一発でできてしまったりしないでしょうか。 access上で可能なスマートな方法があれば教えていただきたいです。 よろしくお願いいたします。

  • SQLの外部結合について教えて下さい

    いつもお世話になっています。 SQL構文の外部結合が分らなくて困っています。 どうか教えて下さい。 JSPからString Nam = (request.getParameter("param"));で値を受け取ってその値でT_Tableと一致するデータのSQLを実行します。 SELECT * FROM T_Table where ID='"+ Nam +"' order by 日付 desc この結果とT_TableAの「番号」というフィールドと一致する問い合わせのSQLが分りません。自分なりに考えて作りましたがHTMLの部分の表示だけでレコードが表示されないので間違っているのだと思います。 色々調べてみましたが該当のサンプルがなかったので困っています。 教えて下さい!宜しくお願い致します。 【自分で作成してみたSQLです】 テーブルはSQL Serverです。 "SELECT * FROM T_Table where ID='"+ Nam +"' INNER JOIN where ID='"+ Nam +"' ON [T_Table].[番号] = [T_TableA].[番号] order by 日付 desc"

    • ベストアンサー
    • Java
  • テーブル間の結合

    次のような操作をしたいのですが、 Table1 CD 1 2 3 Table2 ID TT 1 1 1 2--ココ 2 1 2 2--ココ 結果 Table1とTable2を関連づけて CD ID TT 1 1 2 2 2 2 Table2のTTをMAX関数を使っての参照です。 ちなみに次のようなSQL文ではエラーとなりました。 select T1.CD , T2.ID , MAX(T2.TT) from Table1 T1 INNER JOIN Table2 T2 ON(T1.CD = T2.ID) GROUP BY T2.ID アドバイス等がありましたら、宜しくお願いします。

  • 削除クエリをすると、必要なレコードが消えてしまう

    店のサンプル商品を発注し、返却される一連の作業をAccessで作っています。 T顧客名‥‥フィールド:「ID」「顧客」 Tサンプル品‥‥フィールド:「CD」「商品」 T発注‥‥フィールド:「ID」「CD」「発注日」「数量」←規定値1 T返却‥‥フィールド:「ID」「CD」「返却日」「数量」←規定値1 テーブルは以上です。 クエリは、 Q発注伝票‥‥フィールド 「T顧客:ID」「T顧客:顧客」「Tサンプル品:商品」「T発注:日付」「T発注:数量」 Q返却伝票‥‥フィールドは「T発注」の部分が「T返却」に変わります。 発注されたサンプル商品が返却されたら、 クエリの発注と返却を照合し、「T顧客:ID」と「Tサンプル品:商品のサンプル商品が一致した場合、 Q発注伝票のレコードだけ削除したいと思っています。 数量は規定1で、2以上発注しないので、無視でOKなのです。 削除クエリを用いましたが、なぜか、発注伝票だけでなく、返却伝票のレコードごと無くなってしまいました。 式を変えればエラーになり、また変えれば明後日の場所が消えたり‥‥。 何度やってもうまくいきません。 どのような解決策をすればよいか、煮詰まっています。 なお、クエリの更新が自動で出来れば良いとも思っていますが、出来ますでしょうか?

  • ピボットテーブルについて

    ピボットテーブルについて 業者番号 数量  品名   業者番号   数量   品名  235    23   ノート     355     58    鉛筆 これをピボットテープルにすると 業者番号 数量  品名   業者番号2   数量2   品名2 と別の項目になってしまいます。そのため毎回 業者番号 数量   品名  235    23    ノート   355    58    鉛筆 と並び替えてからピボットテーブルを行っています。 これを並び替えないでやる方法を教えてください。    

  • 日付の前後関係で2つのテーブルを結合したい

    はじめまして。 親子関係を持つ2つのテーブルを結合するSQLについて教えてください。 データベースはAccess2003です。 親テーブル:契約基本 【基本SEQ】【契約番号】 【契約者名】【基本契約年月日】 1     K0001    契約者1A 2013/05/01 2     K0001    契約者1B 2013/05/10 3     K0001    契約者1C 2013/05/20 4     K0002    契約者2A 2013/06/10 5     K0002    契約者2B 2013/06/10 6     K0002    契約者2C 2013/06/10 7     K0003    契約者3A 2013/07/01 8     K0003    契約者3B 2013/07/10 9     K0003    契約者3C 2013/07/10 子テーブル:契約明細 【契約番号】【契約種別】【明細契約年月日】 K0001    S1     2013/05/05 K0001    S2     2013/05/10 K0002    S1     2013/06/05 K0002    S2     2013/06/10 K0003    S1     2013/07/05 K0003    S2     2013/07/15 契約基本テーブルの基本SEQはオートナンバーです。 この2つのテーブルを以下の条件で結合したいです。 ・契約明細テーブルの1レコードについて、契約基本テーブルから1レコードずつ結合 ・結合する契約基本テーブルの条件は、以下の通り  1.契約明細・契約番号単位で、明細契約年月日に最も近い基本契約年月日のレコード    (明細契約年月日を超えない。明細契約年月日と同一日はOK)  2.1.の条件を満たす契約基本テーブルのレコードが複数存在する場合、    その中で基本SEQが最大のレコード  3.1.の条件を満たす契約基本テーブルのレコードが存在しない場合、    該当する契約明細レコードは出力対象外。 以上の条件をもとに、1つのSQLで以下のような結果を取得したいです。 【契約番号】【契約種別】【明細契約年月日】【基本SEQ】【契約者名】【基本契約年月日】 K0001    S1     2013/05/05    1     契約者1A 2013/05/01 K0001    S2     2013/05/10    2     契約者1B 2013/05/10 K0002    S1     2013/06/05…[条件を満たす親レコードがないため出力対象外] K0002    S2     2013/06/10    6     契約者2C 2013/06/01 K0003    S1     2013/07/05    7     契約者3A 2013/07/01 K0003    S2     2013/07/15    9     契約者3C 2013/07/10 1つのSQLで処理したい理由は、そのSQLをクエリに登録して、データシートに紐付け、 一覧表示したいと考えているためです。 以上よろしくお願いします

  • ACCESSで複数テーブルのクエリ抽出

    ACCESSで複数テーブルのクエリ抽出 初めて投稿させてもらいます。 テーブル1・・・社員ID(主キー)、氏名 テーブル2・・・社員ID(重複キー有)、顧客ID テーブル3・・・社員ID(重複キー有)、得意先ID テーブル4・・・顧客ID、顧客氏名 テーブル5・・・得意先ID、得意先 上記のテーブル内容を1つのクエリで全部抽出するとき、 テーブル1の社員ID[a]とテーブル2の社員ID[a] と テーブル1の社員ID[a]とテーブル3の社員ID[a] を分けて抽出する方法ってありますか? クエリの結合プロパティで テーブル2の全レコードとテーブル1の同じ結合フィールドと テーブル3の全レコードとテーブル1の同じ結合フィールドにすると 「あいまいな外部接続が含まれているのでSQLを実行出来ません」とエラーになり、 テーブル1の全レコードとテーブル2の同じ結合フィールドと テーブル1の全レコードとテーブル3の同じ結合フィールドにすると 社員ID[a]、顧客ID[1]、得意先ID[α]、顧客氏名[吉田]、得意先[○○商事] 社員ID[a]、顧客ID[1]、得意先ID[β]、顧客氏名[吉田]、得意先[△△金融] みたいになってしまうのです。 やりたい結果は 社員ID[a]、顧客ID[1]、得意先ID["空欄"]、顧客氏名[吉田]、得意先["空欄"] 社員ID[a]、顧客ID["空欄"]、得意先ID[β]、顧客氏名["空欄"]、得意先[△△金融] 説明下手ですいませんが、ご教授の程よろしくお願いします。

  • Accessのフォームでデータを入力すると、テーブルと一致するデータをあるフィールドに代入してしまうことは可能ですか?

    本来のAccessの使い方ではないかもしれませんが・・・。 あるフォームで品番を入力すると、品番マスターなるテーブルから値を 検索して一致したフィールド(品名・数量)の値を直接フォームの フィールドに代入してしまうことは可能ですか? マクロの値の代入というものを使ってもうまくいきません。 また、クエリーを使えば、品番を入力すれば品名・数量が出るように することはできるのですが表示上だけですので、フォームに直接値 が入力されるようにしたいのです。 方法がうまく思いつきません。どうかお知恵をお貸しください!!

  • テーブル結合

    度々お世話になっています。 Mysqlのテーブル結合したいと思ってます。 テーブル構成は以下のとおりですのでご参照ください。 ■テーブルA id | name 1 | bind 2 | samba 3 | apache ■テーブルB id | detail 3 | test 3 | test 1 | test ■結合結果 id | count 1 | 1 2 | 0 3 | 2 テーブルA,Bはidコラムで紐づいています。 この際、テーブルBのidごとにレコード数を出力したいのですが、 どういったSQLを流せば良いでしょうか。 ご教示願います。

    • ベストアンサー
    • MySQL