- ベストアンサー
Select Distinct の使い方
- Access 2013 VBA / SQLでSelect Distinctを使う方法について解説します。
- 親テーブルと子テーブルを結合し、特定の条件で一意の会社名を表示するSQLの書き方について説明します。
- ID1が1のレコードから会社IDを一意にして選択した会社名を表示するSQLの例を紹介します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
会社名だけならもっとシンプルに出せるかと思います。 SELECT [Table B].会社名 FROM [Table B] WHERE EXISTS ( SELECT 0 FROM [子Table] WHERE [子Table].ID3 = [Table B].ID3 AND [子Table].ID1 = 1 );
その他の回答 (4)
- bin-chan
- ベストアンサー率33% (1403/4213)
#1、#2です #2のGroupbyは、2番目をMAXかMINで囲む前提です。 ルールがわからないので、どちらかお好きな方でどうぞ
お礼
ありがとうございます。 教えて頂いた例を使って見たのですが、max( 会社ID)でくくると、そのレコード数が出てきたような・・・違いますか。3が出たのですが、この数字の意味が良くわかりません。レコードは、全部で5ですので。つまり、会社IDで一番多いIDの数がとれたということでしょうか・・・ 私がしたいことは重複した会社IDを一意にすることなので、この方法はそれとは違いますが、でも、勉強にはなりました。
> この戻り値は、レコードがある場合、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(はぁと)' … でも。 # 私は、コーディング規約で特に規定されていない限り、 # 「なんとなく」ゼロを使うことが多いです。
お礼
ご回答ありがとうございます。 Select 0 の戻り値が、0になり、存在しない場合には、 Rst.EOF = true and Rst.BOF = true となるという事なのでしょうね。
- bin-chan
- ベストアンサー率33% (1403/4213)
#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()で囲うとか
お礼
ありがとうございます。 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)
また属性が書かれてないが、親テーブルの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 ;
お礼
ありがとうございます。 でも、なんかおかしいよ・・・
お礼
このselect 0 from tablename は、ネットで調べたら、where句の条件に合致するレコードが存在するかどうかを調べるときに使うとかいてありました。 この戻り値は、レコードがある場合、0になるのでしょうか。それとも、1? レコードがない場合には、Nullでしょうか?
補足
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も追加してみたらうまく出来ました。これなら、コンボボックスにも使えそうです。 ありがとうございました。