- ベストアンサー
ACCESSのリレーションシップについての疑問
ACCESS初心者です。 ACCESS2002 OSはWindowsXP SP2です。 基本が分かっていないせいなのかもしれませんが、私には理解できない現象が起こっています。対応方法があれば教えていただくようお願いします。 ACCESSでデータ更新のフォームを作っています。 そのフォームは2・3日前に作ったもので、たとえばテーブルAを更新するためにマスターテーブルのBとCを参照しているような形になっています。このリレーションはクエリで指定してあります。 このフォームではクエリに対して更新する形になっています。 このフォームのデザインを編集しているときに「ツール」の「リレーションシップ」をクリックすると画面にはBとCだけが表示されます。 なぜメインのテーブルのAが表示されないのか?と思いながら、しょうがないので右クリックして「すべてのリレーションシップの表示」を押すと、驚いたことにDのテーブルが表示されました。 実はこのDというテーブルは以前に作ったAを作る前に使っていたAによく似たテーブルなのです。 当然、以前にはDとB・Cのリレーションも作っていましたが、今編集中のフォームではDは関係ありません。 リレーションシップの画面は不必要に広大なもので横に3スクロール分と縦にも5スクロール分くらいあって、その右下の端っこにD・B・Cのリレーションだけが表示されていて、それ以外はただただスペースがあるだけです。 なぜ肝心のA・B・Cのリレーションが表示されずD・B・Cのリレーションが表示されるのでしょう? 試しに今では不要であるDのテーブルを削除してみましたがリレーションシップではさすがにDは消えたもののB・Cが表示されるだけで、Aは出てきません。 そもそもACCESSにおけるリレーションシップというのは個々のフォーム内で定義されるものではないのですね?(根本的なことで申し訳ないのですが、買った2冊の本を見てもインターネットで探してもその辺の説明が見当たりませんでした) SQLであれば個々のSQL文で都度JOIN等の記述をすると思うのですが、ACCESSではデータベース全体の共通事項(?)としての定義になるのでしょうか? ACCESSは初心者で見当はずれな質問かもしれませんがどうかよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
【要旨】 ・「リレーションシップ」はデータベース全体に関しての定義になります。 ・クエリの「結合」は、リレーションシップとは別物です。 【詳細】 Accessのメニューで「ツール(T)→リレーションシップ(R)」で表示されるのは、 『そのデータベースのリレーションシップ』です。 フォームのデザイン中に、そのメニューを操作されたために誤解をしかかった ということかと思いますが、そこで表示されるものは、そのとき開いていた フォームには依存しません。 (前回のリレーションシップ表示時(正確には保存時)の状態が再現される だけで、リレーションシップの画面を呼び出す前に表示していたものに よって表示内容が切り替わったりはしない、と) ※この辺りは、フォームのデザイン中に、同様にメニューから「ツール(T)→ 起動時の設定(U)」を選択すると、「そのフォームを起動したときの設定」 ではなく、「そのデータベースを起動したときの設定」が表示されるのを 確認して戴くと、わかりやすいかもしれません。 > このリレーションはクエリで指定してあります。 Accessの画面上では同じような表示になるのでややこしいのですが、 クエリ上で指定できるのは「結合」で、リレーションとは(一応)別物です。 リレーションはデータベースでのテーブル・フィールド間の恒久的な関係を、 結合はそのクエリでのテーブル・フィールドの一時的な関係を、それぞれ 定義している、と言えるかと思います。 (実際には、前者は「一対一/一対他」等の「レコードの主従関係(?)」を、 後者は「共通レコード/一方のテーブルを基準にしたレコードの有無」等 の「レコードの有無関係(?)」を定義してもいるので、上記は(+こちらも ですが)正確な記述ではありませんが(汗)) なので、「リレーションシップ」画面での編集結果は、「新規クエリ作成時 にデザインビューで表示される結合の初期設定」として反映されますが、 「クエリのデザインビュー」での編集結果が、「リレーションシップ」画面に 反映されることはありません。 従って、「リレーションシップの編集・削除」は、ほぼ「リレーションシップ」画面 でしか行えません。 (・・・「ツール(T)→解析(Y)→パフォーマンスの最適化(P)」でも設定できる 場合がありますが) なお、リレーションシップを削除する場合は、「リレーションシップ」画面で ’テーブルを削除する’のではなく、「結合線をクリックして選択し、Delete キーを押す」か、「結合線を右クリックして、削除(D)を選択する」かで 行います。 ※テーブルを削除した場合は、あくまで「リレーションシップ」画面で表示 されなくなるだけで、「すべてのリレーションシップの表示」を行えば、 再びリレーションシップが表示されます。 (Accessの他の画面に例えると、『フィールドリスト』からのドラッグ&ドロップ で作成したコントロールがあったとして、それをフォームから削除すると フォーム上ではそのフィールドは見えなくなるものの、テーブルからその フィールドが削除されているわけではないのと同様、と: かえってわかりにくいかも(汗))
その他の回答 (1)
- mitarashi
- ベストアンサー率59% (574/965)
Accessを再発見してから数年、以前はリレーションシップの事を認識していたのですが、ここしばらくはクエリだけで済ませていました。自分も先日リレーションシップを表示させてみて、クエリの設定は何も反映されていないのだなと思いましたが、基本を忘れていたのですね。改めて調べてみました。 リレーションシップは、データの整合性を維持するために、テーブル相互間の関係を定義する。 クエリーはテーブルなどへの操作を指示する。 リレーションシップを変更してもクエリに反映されないし、逆にクエリを作成、変更してもリレーションシップには反映されない。 リレーションシップを定義してから、クエリを作成するのが本来の姿。 下記のNo.3が本質を突いているように感じます。(感じるだけです...) http://soudan1.biglobe.ne.jp/qa586605.html
お礼
mitarashiさん ありがとうございました。 私も少し分かったように感じます。 (感じただけかも・・・)
お礼
DexMachinaさん 非常に詳しい説明ありがとうございました。 >クエリの「結合」は、リレーションシップとは別物です。 なるほど 実際にやってみましたが「リレーションシップ」で作った結合は「クエリ」を開いた時に自動的に表示されますが、その結合をクエリでは削除してしまって、全く別の項目で「結合」を作っても、エラーになるわけではなく結合できてしまいました。 当然元のリレーションシップはそのまま変更なしで残っています。 実際上ではこのようなことをやること自体めったに無いケースなんでしょうけどACCESSにおけるリレーションシップの考え方がどうなっているかはよく分かりました。 2冊ほど本を読んであとはインターネットで調べたりしながら試行錯誤をしているのですが、もっと基本的なところをしっかりマスターしないといけないのでしょうか? 以前にDB2のSQLをやったことはあってそっちでは多少のことができたのですがACCESSはいろんなツール・画面があって自分が今何をしているのか分からなくなってしまうことが多いです。まだまだ初心者ということですが、先が思いやられます。 またよろしくお願いします。 今回は本当にありがとうございました。