• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Select Distinct の使い方)

Select Distinct の使い方

このQ&Aのポイント
  • Access 2013 VBA / SQLでSelect Distinctを使う方法について解説します。
  • 親テーブルと子テーブルを結合し、特定の条件で一意の会社名を表示するSQLの書き方について説明します。
  • ID1が1のレコードから会社IDを一意にして選択した会社名を表示するSQLの例を紹介します。

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

  • ベストアンサー
noname#212058
noname#212058
回答No.3

会社名だけならもっとシンプルに出せるかと思います。 SELECT [Table B].会社名 FROM [Table B] WHERE EXISTS ( SELECT 0 FROM [子Table] WHERE [子Table].ID3 = [Table B].ID3 AND [子Table].ID1 = 1 );

superwonderful
質問者

お礼

このselect 0 from tablename は、ネットで調べたら、where句の条件に合致するレコードが存在するかどうかを調べるときに使うとかいてありました。 この戻り値は、レコードがある場合、0になるのでしょうか。それとも、1? レコードがない場合には、Nullでしょうか?

superwonderful
質問者

補足

SELECT [Table B].会社ID, [Table B].会社名 FROM [Table B] WHERE EXISTS ( SELECT 0 FROM [子Table] WHERE [子Table].ID3 = [Table B].ID3 AND [子Table].ID1 = 1 ); 教えて頂いたSELECT文に、会社IDも追加してみたらうまく出来ました。これなら、コンボボックスにも使えそうです。 ありがとうございました。

その他の回答 (4)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.5

#1、#2です #2のGroupbyは、2番目をMAXかMINで囲む前提です。 ルールがわからないので、どちらかお好きな方でどうぞ

superwonderful
質問者

お礼

ありがとうございます。 教えて頂いた例を使って見たのですが、max( 会社ID)でくくると、そのレコード数が出てきたような・・・違いますか。3が出たのですが、この数字の意味が良くわかりません。レコードは、全部で5ですので。つまり、会社IDで一番多いIDの数がとれたということでしょうか・・・ 私がしたいことは重複した会社IDを一意にすることなので、この方法はそれとは違いますが、でも、勉強にはなりました。

noname#212058
noname#212058
回答No.4

> この戻り値は、レコードがある場合、0になるのでしょうか。 > それとも、1? 『SELECT 0 … の戻り値』としては当然 0 です。 『EXISTS(SELECT 0 … の戻り値』は、レコードが存在すれば TRUE が返ります。 > レコードがない場合には、Nullでしょうか? 『SELECT 0 … の戻り値』は、レコードがない場合は何も返っ てきません。それは『SELECT 会社名 FROM [Table B]; で、 1件も取得できなかった場合に、会社名 には何が入るのでしょう か?』という質問と同じで、意味がありません。 レコードが取得できなかったのですから、Null ですらありません。 『EXISTS(SELECT 0 … の戻り値』は、レコードが存在しな ければ FALSE が返ります。 EXISTS は『EXISTS 以下のSELECT 文の結果が存在するか 否か』で判別しますので、EXISTS 内の SELECT 句の内容は 何を指定しても OK です。 EXISTS (SELECT * … でも EXISTS (SELECT Null … でも EXISTS (SELECT 'I need you(はぁと)' … でも。 # 私は、コーディング規約で特に規定されていない限り、 # 「なんとなく」ゼロを使うことが多いです。

superwonderful
質問者

お礼

ご回答ありがとうございます。 Select 0 の戻り値が、0になり、存在しない場合には、 Rst.EOF = true and Rst.BOF = true となるという事なのでしょうね。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

#1、エラーだらけだ。ごめんなさい。 Select distinct tblA.ID1, tblC.[会社ID] From [親テーブル] tblA, [子テーブル] tblC, [Table B] tblB Where tblA.ID1 = tblC.ID1 and tblC.ID3 = tblB.ID3 And tblA.ID1 = 1; group by なら Select tblA.ID1, tblC.[会社ID] From [親テーブル] tblA, [子テーブル] tblC, [Table B] tblB Where tblA.ID1 = tblC.ID1 and tblC.ID3 = tblB.ID3 And tblA.ID1 = 1 Group by tblA.ID1 ; 会社IDを強制的にひとつにするならGroupbyにして tblC.[会社ID]をMax()かMIN()で囲うとか

superwonderful
質問者

お礼

ありがとうございます。 Select distinct tblA.ID1, tblC.[会社ID] From [親テーブル] tblA, [子テーブル] tblC, [Table B] tblB Where tblA.ID1 = tblC.ID1 and tblC.ID3 = tblB.ID3 And tblA.ID1 = 1; こちらの例をもとに、うまく出来ました。 2個目の例は select distinct [TblA].[依頼ID], [TblC].[会社ID], [TblB].[会社ID] from [依頼テーブルA] as [TblA], [分析管理テーブルC] as [TblC], [会社管理テーブルB] as [TblB] where [TblA].[依頼ID]=[TblC].[依頼ID] And [TblC].[会社ID]=[TblB].[会社ID] And [TblA].[依頼ID] = 1 Group by [TblC].[会社ID] このようにしたのですが、 「クエリに、集計関数の一部として指定された式「依頼ID」が含まれていません。」 というエラーになります。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

また属性が書かれてないが、親テーブルのIDは数値型と仮定 欲しいのは「会社名」だろうが、 会社IDはABCって「揺らぎ」なんてレベルじゃないけど そこらへんは適宜修正してください Select distinct tblA.ID, tblB.会社名 From [親Table] tblA, [子Table] tblC, [Table B] tblB Where tblA.ID1 = tblC.ID2 and tblC.ID3 = tblB.ID2 and tblA.ID = 1 ;

superwonderful
質問者

お礼

ありがとうございます。 でも、なんかおかしいよ・・・

関連するQ&A