電子書籍の厳選無料作品が豊富!

【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でどのように書けばよいでしょうか

A 回答 (5件)

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



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

この回答への補足

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/12/31 11:38

#1、#2です



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

ありがとうございます。

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

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

お礼日時:2015/01/07 15:22

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

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

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

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

お礼日時:2015/01/05 10:45

#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()で囲うとか
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

また属性が書かれてないが、親テーブルの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
;
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/12/30 22:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!