Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : Access 2021)
Accessのクエリのフィールド名について
投稿日時: 24/04/03 16:49:08
投稿者: suekun9999

お世話になっております。
 
Accessのクエリのフィールド名で
クエリーAは
  テーブルA
  テーブルBを参照
クエリーBは
  クエリーAを参照
となっている場合なのですが
 
(1)クエリBで、フィールドに[テーブルA]![項目1]
というような参照が出来るようです。
 
(2)わたしの場合は、フィールドで[クエリーA]![項目1]
のように参照するのですが、、、
 
(1)のような使用方法は、一般的なのでしょうか?
 
よろしくお願い申し上げます。

回答
投稿日時: 24/04/03 17:05:23
投稿者: sk

引用:
クエリーAは
  テーブルA
  テーブルBを参照
クエリーBは
  クエリーAを参照

引用:
(1)クエリBで、フィールドに[テーブルA]![項目1]
というような参照が出来るようです。

引用:
(1)のような使用方法は、一般的なのでしょうか?

・[項目1]という名前のフィールドが[テーブルA]のみに存在しているのか、
 それとも[テーブルB]にも同名のフィールドが存在しているのか
 
[項目1]という名前のフィールドがどちらのテーブルにも存在している場合
 [クエリーA]においてどちらか一方のテーブルの[項目1]を選択しているのか、
 それとも両方のテーブルの[項目1]を選択しているのか
 
・両方のテーブルの[項目1]を選択している場合、
 それぞれのフィールドに対して別名を付けているのか
 
という要素が関係してくるため、「一般的かどうか」以前に
まず「そのように記述する必要があるかどうか」という問題でしょう。
 
引用:
(2)わたしの場合は、フィールドで[クエリーA]![項目1]
のように参照するのですが、、、

[クエリーA]によって返されるフィールドの中で
[項目1]という名前のフィールドが 1 つだけなのであれば
そのようにするのが「一般的」であるとは言えます。

投稿日時: 24/04/03 19:44:08
投稿者: suekun9999

sk様 ありがとうございます。
 

引用:
クエリーAは
  テーブルA
  テーブルBを参照
クエリーBは
  クエリーAを参照
(1)クエリBで、フィールドに[テーブルA]![項目1]
というような参照が出来るようです。
(1)のような使用方法は、一般的なのでしょうか?

sk さんの引用:
・[項目1]という名前のフィールドが[テーブルA]のみに存在しているのか、
 それとも[テーブルB]にも同名のフィールドが存在しているのか

 
→[テーブルB]には同名のフィールドは存在しません。
 
sk さんの引用:
[項目1]という名前のフィールドがどちらのテーブルにも存在している場合
 [クエリーA]においてどちらか一方のテーブルの[項目1]を選択しているのか、
 それとも両方のテーブルの[項目1]を選択しているのか

 
→テーブルAの[項目1]を選択しています。
 
sk さんの引用:
・両方のテーブルの[項目1]を選択している場合、
 それぞれのフィールドに対して別名を付けているのか

 
→片方のテーブルのみ選択していますので、別名は付けていません。
 
引用:
(2)わたしの場合は、フィールドで[クエリーA]![項目1]
のように参照するのですが、、、

sk さんの引用:
[クエリーA]によって返されるフィールドの中で
[項目1]という名前のフィールドが 1 つだけなのであれば
そのようにするのが「一般的」であるとは言えます。

 
引用:
(1)クエリBで、フィールドに[テーブルA]![項目1]
というような参照が出来るようです。

 
→[項目1]は、クエリAの項目なので、
[クエリーA]![項目1]
 のところを、
[テーブルA]![項目1]
と記載するのは、表面上見えていない項目を指定しているので
一般的で無いと思ったのですが、いかがでしょうか?
よろしくお願い申し上げます。

回答
投稿日時: 24/04/03 21:54:09
投稿者: MMYS

suekun9999 さんの引用:

(1)クエリBで、フィールドに[テーブルA]![項目1]
というような参照が出来るようです。

サブクエリ ( 副問合せ ) を理解されることをおすすめします。
 
 
suekun9999 さんの引用:

クエリーBは
  クエリーAを参照
となっている場合なのですが

これは、サブクエリそのものです。つまり下記SQLと同等です。
 
SELECT テーブルA.項目1, テーブルB.項目2
FROM (SELECT テーブルA.項目1, テーブルB.項目2
      FROM テーブルA INNER JOIN テーブルB
        ON テーブルA.ID = テーブルB.ID
);
 
 
suekun9999 さんの引用:

[テーブルA]![項目1]
と記載するのは、表面上見えていない項目を指定しているので

見えない項目。って考えが間違い。
たとえば、下記のように記載すると、期待した動作はしませんが。なぜか理解出来ますか。
 
SELECT テーブルA.項目1
FROM (SELECT テーブルB.項目2
      FROM テーブルA INNER JOIN テーブルB
        ON テーブルA.ID = テーブルB.ID
);
 
 

投稿日時: 24/04/04 07:37:02
投稿者: suekun9999

MMYS さんの引用:
suekun9999 さんの引用:

(1)クエリBで、フィールドに[テーブルA]![項目1]
というような参照が出来るようです。

サブクエリ ( 副問合せ ) を理解されることをおすすめします。
 
 
suekun9999 さんの引用:

クエリーBは
  クエリーAを参照
となっている場合なのですが

これは、サブクエリそのものです。つまり下記SQLと同等です。
 
SELECT テーブルA.項目1, テーブルB.項目2
FROM (SELECT テーブルA.項目1, テーブルB.項目2
      FROM テーブルA INNER JOIN テーブルB
        ON テーブルA.ID = テーブルB.ID
);
 
 
suekun9999 さんの引用:

[テーブルA]![項目1]
と記載するのは、表面上見えていない項目を指定しているので

見えない項目。って考えが間違い。
たとえば、下記のように記載すると、期待した動作はしませんが。なぜか理解出来ますか。
 
SELECT テーブルA.項目1
FROM (SELECT テーブルB.項目2
      FROM テーブルA INNER JOIN テーブルB
        ON テーブルA.ID = テーブルB.ID
);
 
 

ありがとうございます。
テーブルA.項目1が、FROM句以下に無いからだと思います。
 
サブクエリについて学習したいのですが、良書がありますでしょうか?

回答
投稿日時: 24/04/05 14:27:53
投稿者: sk

suekun9999 さんの引用:
テーブルAの[項目1]を選択しています。

suekun9999 さんの引用:
片方のテーブルのみ選択していますので、別名は付けていません

suekun9999 さんの引用:
[クエリーA]![項目1]
 のところを、
[テーブルA]![項目1]
と記載する

ならば実質的には次のようなクエリを実行しているのと同じです。
 
([クエリーB]の SQL ビュー)
---------------------------------------------------------------
SELECT [クエリーA].[テーブルA].[項目1]
FROM [クエリーA];
---------------------------------------------------------------
 
この場合、FROM 句で呼び出されているテーブル/クエリは
[クエリーA]だけなので、SELECT 句におけるクエリ名の
修飾を省略し、次のように記述することも出来ます。
 
([クエリーB]の変更例 1 )
---------------------------------------------------------------
SELECT [テーブルA].[項目1]
FROM [クエリーA];
---------------------------------------------------------------
 
([クエリーB]の変更例 2 )
---------------------------------------------------------------
SELECT [項目1]
FROM [クエリーA];
---------------------------------------------------------------
 
もし[クエリーA]において[テーブルA]の[項目1]と[テーブルB]の[項目1]が
両方とも選択されており、かつどちらにも別名がつけられていない
(次のようなクエリである)場合は、上記 1 の例のように記述しなければ、
どちらのテーブルの[項目1]を参照すべきか特定することが出来ません。
 
([クエリーA]の SQL ビュー)
---------------------------------------------------------------
SELECT [テーブルA].[ID],
       [テーブルA].[項目1],
       [テーブルB].[項目1]
FROM [テーブルA]
INNER JOIN [テーブルB]
ON [テーブルA].[ID] = [テーブルB].[ID];
---------------------------------------------------------------
 
したがって、上記 2 の例のような記述の仕方をすれば構文エラーが発生します。
 
引用:
表面上見えていない項目を指定している

[クエリーA]において選択された[テーブルA]の[項目1]に
別名がつけられていないのであれば、MMYS さんが例示されたように
「ネストされたクエリ側において選択されたフィールドを
ネストしたクエリ側からそのまま参照している」に過ぎません。
 
逆に[テーブルA]の[項目1]に対して次のように別名がつけられた場合、
ネストする側のクエリではその別名を記述する必要があります。
 
([クエリーA]の SQL ビュー)
---------------------------------------------------------------
SELECT [テーブルA].[ID],
       [テーブルA].[項目1] AS [項目1_A],
       [テーブルB].[項目1] AS [項目1_B]
FROM [テーブルA]
INNER JOIN [テーブルB]
ON [テーブルA].[ID] = [テーブルB].[ID];
---------------------------------------------------------------
 
([クエリーB]の SQL ビュー)
---------------------------------------------------------------
SELECT [クエリーA].[ID],
       [クエリーA].[項目1_A],
       [クエリーB].[項目1_B]
FROM [クエリーA];
---------------------------------------------------------------
 
先述した「そのように記述する必要があるかどうか」というのは、
つまりそういうことです。
 
以上の点を踏まえて話を本題に戻すと、上記のような構文上/機能上の
問題を含んでいないのであれば、"[クエリーA].[テーブルA].[項目1]"
のように冗長な記述をわざわざする必要はないと言えます。
普通に "[クエリーA].[項目1]" と記述なさればよいでしょう。

回答
投稿日時: 24/04/05 18:24:33
投稿者: Suzu

横から失礼します。
 
そもそものご質問とは違うのですが、琴線に触れたので。。
 
 
[テーブルA]![項目1]
 
これは、[テーブルA] の フィールド [項目1] を参照します。
 
クエリや、フォーム/レポート上 から 他のフォーム/レポートのコントロールを参照するにも
[Forms]![フォーム名]![コントロール名] / [Reports]![フォーム名]![コントロール名]
を使えますよね。
 
式の構文の概要
https://support.microsoft.com/ja-jp/topic/%E5%BC%8F%E3%81%AE%E6%A7%8B%E6%96%87%E3%81%AE%E6%A6%82%E8%A6%81-ebc770bc-8486-4adc-a9ec-7427cce39a90
 

引用:
識別子演算子 識別子では、次の 3 つの演算子を使うことができます。
 
感嘆符演算子 (!)
 
ドット演算子 (.)
 
角かっこ演算子 ([ ])
 
識別子の各部分を角かっこで囲み、感嘆符演算子またはドット演算子を使って各部分を結合します。 たとえば、Employees テーブルの Last Name フィールドの識別子は、[Employees]![Last Name] と表すことができます。 感嘆符演算子は、後に続く部分が感嘆符演算子の前にあるコレクションに属するオブジェクトであることを、Access に伝えます。 この例では、[Last Name] は [Employees] コレクションに属するフィールド オブジェクトであり、[Employees] 自体はテーブル オブジェクトです。
 
厳密にいえば、識別子または部分識別子を囲む角かっこを常に記述する必要はありません。 識別子にスペースまたは他の特殊文字が含まれない場合は、式が読み取られるときに角かっこが自動的に追加されます。 ただし、角かっこは常に記述しておくことをお勧めします。そうすれば、エラーを回避するのに役立つだけでなく、式の特定の部分が識別子であることを示す視覚的な手がかりとしても機能します。

 
 
でも、Excel VBAに慣れてくると違和感。
[テーブルA].[項目1] や、Forms(フォーム名).Controls(コントロール名) なら 違和感無いのですが・・
 
 
こんなのも。
 
アクセス特有の書き方?
https://oshiete.goo.ne.jp/qa/3364484.html
 
 
既定コレクション いいなぁ
 Excel の WorkSheetの既定コレクション Range でも良くない?
 とひとりごとをつぶやいてみる。
 
関係ない話失礼しました。

投稿日時: 24/04/08 10:49:19
投稿者: suekun9999

皆様、大変ありがとうございました。
とても勉強になりました。
今後ともよろしくお願いいたします。