• ベストアンサー

アクセス:クエリの結合とリレーションシップの違いについて

アクセス初心者です。 ◆ある請求システムをクエリ上の結合と関数だけでほぼ完成できました。誤作動もなく、正確な結果がでます。いわゆるリレーションシップをしないでの構築です。 ◆構成は、請求対象者の個人IDをキーにして、請求対象日付、基本料、食事料、立替金、その他請求という比較的シンプルななものを結合させて作成しています。クエリ上で関数で日付のところで何月分の請求かを抽出するようなしくみです。 ◆しかるに、完成させてしまってから「リレーションシップ」はしたほうがいいという内容のものをいくつかの資料でたまたま目にするようになりました。 ◆しかるにクエリーでできてしまったシステムで現時点で不具合は全く発生せず、リレーションの必要性が理解できません。 ◆というより、リレーションシップそのものを知らない段階でクエリの結合に取り組んだ者ですから、リレーションシップとは何ぞや?というレベルです。 ◆そこで、今回、クエリの結合とリレーションシップの違いについてアドバイスをいただけないでしょうか? よろしくお願いします。

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

  • ベストアンサー
回答No.8

追記ばかりで申し訳ないです。 SQL:Structured Query Language の略。DBを操作する言語。 (詳細はネット検索などで調べてくださいね。) クエリの実態はSQLです。 クエリをSQLビューで開いてみてください。 SELECT ・・・がそうです。 SQLで直接記述をすると、クエリのデザインビューで指定できないことも指定可能になります。 (よく利用するのか、ユニオンクエリかな?)

yastaro
質問者

お礼

ご丁寧にご説明してくださり心より感謝します。 初心者(素人)はわからない用語(今回のようなSQL)に出くわすだけで心理的に”しりごみ”してしまいます。 GreatDragonさんのように、優しくご解説くださるとアクセスの本質に踏込みやすくなります。その点、何度も追記してくださったことはうれしく、感謝でした。勉強がんばります。ありがとうございました^^

その他の回答 (7)

回答No.7

追記しようと思ったら他の方から既に回答出てますね。 リレーションシップウィンドウでの設定はあくまで定義のみです。 クエリなどでその設定が自動的に使用されます。 クエリ上で自分で結合するなら、リレーションシップウインドウでの設定いは無くても構いません。 尚、設計云々はシステムの設計手法なるものがありますが、DBの部分に限っていえば 初期の段階で「テーブルの正規化」が必要でその一連の作業の中でリレーションシップが出てきます。

noname#22222
noname#22222
回答No.6

s_husky です。 全ての学習は、ヘルプ文で事足ります。 私は、一度も、WEBや本で調べた経験がありません ヘルプを参照して下さい。

yastaro
質問者

お礼

何度もありがとうございました。 ヘルプ文だけで勉強なさるs_huskyさんの力量はすばらしいと思います。私もがんばってみます。ご指導、アドバイスありがとうございます。前回のご回答とあわせて感謝申し上げます。

noname#22222
noname#22222
回答No.5

必要なリレーションシップについては、テーブルの設計段階で設定するのが基本中の基本です。 リレーショナルデータベースと言われる理由です。 そういうテーブル設計が先にありきです。 クエリーでもってテーブル間結合を追加できるのは、おまけみたいなものです ですから、おまけのみに頼るのは、一種の邪道です。 土台のテーブル設計をしっかりしておけば、 ・クエリーが複雑怪奇になることはありません。 ・サブフォームを持つフォームの作成も簡単に行えます。 ・SQL文も簡略化します。 ・何よりも、データを効率良く登録できます。 Access の真価は、いかにリレーショナルデータベースとしてテーブルを設計するかにかかっています。 ※Accessのヘルプの冒頭にある「データベースを作成、使用する」を読まれるといいと思います。

yastaro
質問者

補足

ありがとうございます。 なるほど、「邪道」なるものを作ってしまったような気がします^^; 初心者とはいえ、自分で調べるべきないようでしょうが、「SQL文が簡略化できる」ことについてもう少し教えてくださいませんでしょうか?SQLとはどういうものかさえよくわかっていないので・・・ ごめんなさい。よろしくお願いします。

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.4

>クエリの結合とリレーションシップの違い 言葉の違いから言えば リレーションシップ:2つのオブジェクトの関連性。関係。です。テーブルの場合一方のテーブルの列がもう一方のテーブルの列にどのようにリンクされているかを示すことを言います。 結合:2つのテーブルを共通するキーにより関係づけて新しい1つのテーブルのようにする操作です。 >クエリ上で結合するよりもリレーションシップウインドウで定義するほうが間違いないというような相違点があるか どちらでも相違はありません。(結合に間違えが無ければですが) リレーションシップウィンドウで設定しておけばクエリなどでそのテーブルを使うと自動結合してくれる。リレーションシップで設定していなくてもクエリ上で結合すればSQLを発行し実行できる。 予め確定しているリレーションはリレーションシップで設定しておきクエリ(SQL)上でのみ必要ならクエリ上で結合すれば良いという事です。 レコード間の整合性を取るのか取らないのか等やどのように結合するのかなど色々ありますのでその辺は勉強した方が良いと思います。

yastaro
質問者

お礼

ありがとうございます。だいぶわかってきました。クエリ上の結合でも「してはいけない間違い」ではないという点では安心しました。もっと勉強してみます。ありがとうございました。

  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.3

リレーションシップでの連結は既定値だと思ってください。 クエリやコンボボックス・リストボックス等を使う場合、ここの設定が初期値になります。 また、リレーションシップの場合、マスタとデータの連結で マスタを修正・削除すればデータ側も連動して修正・削除されるといった設定も可能です。

yastaro
質問者

補足

ありがとうございます。少しイメージできかけました。「既定値」について、まだすこしニュアンスがつかみかねていますが・・・。 #1さんにも補足をお願いしましたが、クエリ上で結合したものとリレーションシップの定義をすることと連動・修正・削除は別として同じものと考えても差し支えないものでしょうか?それともあくまでリレーションシップ定義をすることが原則的に必要なものでしょうか?もう少し詳細を教えてくだされば幸いです。 よろしくお願いいたします。

回答No.2

追記です。 リレーションシップについて詳しく知りたい場合は、キーワードを「テーブルの正規化」でネット検索してみてください。 最初は難しいかもしれませんが、DBの本質みたいなもの?が理解できると思います。

yastaro
質問者

お礼

ひきつづき、ありがとございます。早速調べてみます^^

回答No.1

??? テーブルの結合をリレーションシップと言います。 リレーションシップウインドウで定義したり、クエリ内で複数テーブル結合します。 クエリ内で既に結合していると言うことは、知らないうちにリレーションシップを利用していることになります。

yastaro
質問者

補足

ありがとうございます。 質問の趣旨は、リレーションシップウインドウで定義するものとクエリ内で定義するものとの違いについてです。例えばクエリ上で結合するよりもリレーションシップウインドウで定義するほうが間違いないというような相違点があるかどうか・・・ そのような質問を申し上げたかったのです。

関連するQ&A

  • MS ACCESSにおいてのリレーションシップ設定

    ACCESSを使用してシステムを構築しているのですが、テーブル間のリレーションシップについて疑問があります。 リレーションシップを設定することにより、データベースの整合性を得ることができますが、その他のメリットはあるのでしょうか? ある文献では検索時間の短縮になるとあったのですが、本当なのでしょうか? 通常の表結合クエリーと参照整合性以外の違いはどのようなものでしょうか? 回答をお願いします。

  • Access2000のリレーションシップのエラーについて

    どのくらい説明すればいいのかわからないのですが、アクセス2000でリレーションシップの設定をするときに、 「主テーブルで参照されているフィールド用の固有インデックスがありません。」 というエラーメッセージが出てきてリレーションを作る事が出来ません。 問題なのは3つのテーブルのリレーションなのですが、それぞれのインデックスをチェックすればいいのだとは思いますが、対象となったフィールドは主キーではないので、重複は許可していますが、一応どちらもインデックスは作成しています。 どのようなリレーションシップかというと、業者テーブルと商品テーブルと販売履歴テーブルのリレーションで、 商品テーブルの業者IDと業者テーブルのIDのリレーション→左内部結合(商品テーブルの全フィールドに入れる) 業者テーブルの業者IDと販売履歴の業者IDのリレーション→右内部結合 は出来るのですが、商品テーブルの商品名と値段フィールドと、販売履歴の対応する部分についてのリレーションについてもたせようとするとエラーが出てしまいます。このようなリレーションはいらないのでしょうか? どちらも固有の値でない量のリレーションだからなのでしょうか? この二つのフィールドの参照整合性をどう保てばいいのか教えて下さい。

  • アクセスのリレーションシップ

    アクセス2007を使用しています。 顧客表 (顧客コード 顧客名) 注文表 (顧客コード 商品名 数) と言う表があります。 二つの表を 1.リレーションシップをはる 2.結合する(クエリ:売上表) 上記作業を行い売上表を作成しました。 売上表作成の流れは、 「当然顧客コードで2つの表が結合され、両方の表に存在する値の行が表示される」 と思っております。 今回の結合(等結合)表の作り方は以下の流れだと思っております。 1. 顧客表、注文表の直積を出す。 2. 顧客表・注文表の顧客コードで一致する行を抽出する。 ここで質問なのですが、 一度、リレーションシップを作成しないで、 顧客表と、注文表を結合しようとし、クエリの売上表を作成しようとしました。 すると、直積結果までしか出ませんでした。 (SQLウィザードを確認しましたが、FROM句までのSQLしかありませんでした。Where,Innnerなし) これはつまり、リレーションシップを張らなければ、等結合が行われないということで 間違いないでしょうか?(Where、Inner JOINでの条件が入らない)

  • Accessのクエリ(テーブルの結合)

    Accessのクエリで以下のようなものを作成したいのですが、SQL文がわかりません。 ↓ tblA,tblB,tblC はそれぞれ同じ項目(AAA,Cnt(AAAの値別カウント数)、日付)を持っています。 tblA,tblB,tblC を全部結合して、日付、AAAでグルーピングしたカウントを取りたいのですが、 どのようなクエリ文になるのでしょうか? また、Oracleでいうunion all関数はないのですか? よろしくお願いします。

  • 【Access】コンボボックスとクエリについて!

    完成イメージとして 下記のような画面にしたいです。 (1)日付を入力する 20110401~20110402 (2)「クエリ抽出」を押下する。 によって (1)で入力した日付内でクエリを抽出する。(クエリ実行結果の表示)クエリには他の条件が入力されている。(固定) (1)と(2)をどのようにリンクすればよいかまったくわかりません。 注 画面はイメージで作成したものですので中身なしの見かけだけです汗 詳しい方いたら、助言頂けると幸いです。Accessはまったくの素人です。 なんとか、よろしくお願いします!!! windows XP Access2000です。

  • Access 複数テーブルのリレーションシップ

    Access2013  4種類の名簿をそれぞれのテーブル(4種類)で管理してありますが、 同じ方(氏名)が4種類の名簿全部には無く、2つや3つの名簿にばらばらにあります。  この4つのテーブルを同時に表示し入力できる分割フォームをつくりたいのですが、 この際の、4つテーブルの氏名をリレーションシップする結合プロパティの設定方法を教えて下さい。 あるいは、クエリのそれぞれのテーブルのフィールド(氏名)の抽出条件になんと書き入れたらよいか。教えて下さい。 宜しくお願いします

  • Access2000のクエリで日付が3日以内のものを求める際の関数

    お世話になります。 Access2000のクエリで使う関数について教えてください。 日付が、指定した日付よりも3日以内のレコードを抽出するというような操作をしたいのですが、どんな関数を使えばよいかわかりません。 使用目的は、灯油の配送日に関して、「今日から3日以内に配送が必要なのはどこか?」という抽出です。 お忙しいところ恐縮ですが、どうかお教えくださいませ。 お願いいたします。

  • Access 抽出クエリーについての条件

    先の投稿に重複しますが、 それぞれ異なるテーブルについて、 クエリーで、、 Between #5:00# And #19:00# Between 500 And 1900 上記の方法等で同じ数値ではなく、 期間に幅をもたせて一致としそれぞれの 一致データを抽出するクエリーは つくれますか? もちろん抽出対象のテーブル、列はそれぞれ同じ書式です。 > between関数を使って、 フィールドのデータ型が日付/時刻型の場合 抽出条件欄に、 > 5:00から19:00を抽出したい、 Between #5:00# And #19:00# > 5:00から25:00を抽出したい、 Between #5:00# And #23:59# OR Between #0:00# And #1:00# Access の日付/時刻型では、25:00 というような表現はできないので、上記のように分割することになります。 > また上記がテキストだった場合も、 > 500から1900を抽出したい フィールドがテキスト型の場合、テキスト比較になり数値比較とは異なる抽出結果になるので、 フィールドに Val([テキスト型フィールド]) と式を設定して数値型に変換します。このの抽出条件に、 Between 500 And 1900 と設定します。 通報する

  • 複数のクエリを結合して実行したら・・・

    アクセス2000で行き詰まっています。月報を作成します。 テーブルは 1.日付 2.原料の受入(3社) 3.原料の使用 4.製品出来高4つです。 それぞれをクエリを作成して別に日付と結合しました。結合プロパティは抽出した期間の日付の全レコードと同じ結合フィールドの[受入日][使用日][出来高日]のレコードが表示されるように設定しました。 ところが、原料のLOT・使用量が同じ使用日に複数あると原料の受入や製品の出来高も複数行(同一日・同一量)表示されます。この結果を月別にレポートにしたいのですが、上のデータと同一なら非表示に設定できますか?教えてください。

  • access2003で軽快な検索クエリを作るには?

    access2003で検索フォームを作成しています。 リレーションの結ばれた複数のテーブルを対象に、検索語句による検索をしようとクエリを作っています。 基本となるテーブルには数値(ID)が中心となっており、それらの実際の値をDlookUpで参照して結果を作っています。 この際に、DlookUpで指定した参照元について抽出条件を設定すると異様に時間が掛かり、実用的ではなくなってしまいました。 テーブルの構成上、DlookUpを使わざるを得ないので、その参照元も含めて検索語句で抽出できるようにしたいのですが、 どのようにすればレスポンスの良い検索クエリができますでしょうか。

専門家に質問してみよう