みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Select Distinct の使い方

【Access 2013 VBA / SQL】

[親Table]
*ID1
*日付
*受注元会社名

{子Table ]
*ID2(主キー)
*ID1(親テーブルのID)
*ID3(外部キー)

[Table B]
*ID3
*会社名

------------------------------
ID2  ID1    会社ID
------------------------------
1    1     A
2    1     B
3    1     B
4    1     C
5    2     B
6    2     A
7    2     A
------------------------------

ID1=1のもので、会社IDを一意にして選択した会社名を表示したい
この時、SQLでどのように書けばよいでしょうか

投稿日時 - 2014-12-30 18:34:40

QNo.8875095

すぐに回答ほしいです

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

会社名だけならもっとシンプルに出せるかと思います。

SELECT [Table B].会社名
FROM [Table B]
WHERE EXISTS (
SELECT 0
FROM [子Table]
WHERE [子Table].ID3 = [Table B].ID3
AND [子Table].ID1 = 1
);

投稿日時 - 2014-12-30 23:13:05

補足

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も追加してみたらうまく出来ました。これなら、コンボボックスにも使えそうです。

ありがとうございました。

投稿日時 - 2015-01-07 15:06:29

お礼

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

投稿日時 - 2014-12-31 11:38:28

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

#1、#2です

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

投稿日時 - 2014-12-31 14:15:03

お礼

ありがとうございます。

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

私がしたいことは重複した会社IDを一意にすることなので、この方法はそれとは違いますが、でも、勉強にはなりました。

投稿日時 - 2015-01-07 15:22:05

> この戻り値は、レコードがある場合、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(はぁと)' … でも。

# 私は、コーディング規約で特に規定されていない限り、
# 「なんとなく」ゼロを使うことが多いです。

投稿日時 - 2014-12-31 13:01:31

お礼

ご回答ありがとうございます。

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

投稿日時 - 2015-01-05 10:45:44

ANo.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()で囲うとか

投稿日時 - 2014-12-30 21:10:06

お礼

ありがとうございます。

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」が含まれていません。」
というエラーになります。

投稿日時 - 2014-12-30 23:04:48

ANo.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
;

投稿日時 - 2014-12-30 20:57:31

お礼

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

投稿日時 - 2014-12-30 22:25:22