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

締切り済みの質問

Accessクエリにて

お世話になります。

下記テーブルがあります。

■型番テーブル
ID 型番 数量
1  A   1
2  B   1
3  C   1
4  D   1
5  E   1

■発売日テーブル
ID 型番 発売日    削除
1  A   2010/01/01 False
2  B   2010/05/01 False
3  C   2011/03/01 False
4  D   2011/05/01 True
5  E   2011/06/01 False


■上記テーブルを用いたクエリ

・型番テーブルの「型番」と発売日テーブルの「型番」を
 紐付ける

・表示したいフィールドは「型番」「発売日」。

・表示したいのは型番テーブル全件(5レコード)。

・発売日テーブルの削除がTrueの場合、発売日を空白とする。

***************
ここで質問です。

型番テーブルの全件を表示したいところですが、条件として発売日テーブルの
削除がFalseである為、型番Dが表示されません。

発売日テーブルであらかじめ削除がFalseのみでクエリを作成し、そのクエリと
型番テーブルの「型番」で紐付ければ全件表示されることは分かっており
ますが、1つのクエリで表示する方法をご教授頂ければと思います。

宜しくお願い致します。

投稿日時 - 2011-05-06 19:12:26

QNo.6718522

すぐに回答ほしいです

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

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

回答(6)

ANo.6

No5です。
No5を少し説明を加えますと、型番テーブルのレコード数が
35000で発売日テーブルのレコード数が35500ならばNo2の
クエリの結果は
>・表示したいフィールドは「型番」「発売日」。
>・表示したいのは型番テーブル全件(5レコード)。
>・発売日テーブルの削除がTrueの場合、発売日を空白とする。
の条件をもとに作成しているので、当然ながら35500に
なります。
最終的に表示したいクエリの条件が質問のままなのか、
あるいは補足にあるようにFalseのみを表示したいのか
明確にすべきだと思いますが。

投稿日時 - 2011-05-10 09:51:30

お礼

お礼が遅くなり申し訳ございません。
また、説明不足ですみません。

もう一度整理しますと、発売日テーブルには型番の重複があり
片方は削除がTrueとなっております。
よって、削除=Falseを条件にして抽出すると、不要なレコード
(削除がTrueとなっているレコード)は除外されます。
※これを発売日クエリとします。

で、型番テーブル全件(35000レコード)に対して、この発売日
クエリを型番で紐付けると、ちゃんと35000レコードになります。
※これを型番全件クエリとします。

要するに、この型番全件クエリを一つのクエリで作れないか
ということです。


ちなみに、型番テーブルの型番が、必ずしも発売日
テーブルに存在するとは限りません。

投稿日時 - 2011-05-13 11:14:56

ANo.5

表示したいことが、

>・表示したいフィールドは「型番」「発売日」。
>・表示したいのは型番テーブル全件(5レコード)。
>・発売日テーブルの削除がTrueの場合、発売日を空白とする。

であれば、当然ながらNo2で示した方法でいいはずです。
ところが、「発売日テーブル」に重複がある場合、
その重複を取り除き、かつ、上記の3番目の条件も
表示したいということは矛盾します。


もし、発売日の後先に関係なく「発売日テーブル」の
削除フィールドがTrueの発売日を除くということであれば、
単純に発売日の抽出条件に、
[発売日テーブル]![削除]=False
を設定するだけです。


SELECT 型番テーブル.型番, 発売日テーブル.発売日
FROM 型番テーブル INNER JOIN 発売日テーブル ON 型番テーブル.型番 = 発売日テーブル.型番
WHERE (([発売日テーブル]![削除]=False))
ORDER BY 型番テーブル.型番;

投稿日時 - 2011-05-10 09:36:47

ANo.4

>発売日テーブルには同型番が重複して登録されている場合がありますが、片方のレコードは削除がTrueとなっております。
 発売日テーブルのデータは同型番、別発売日で削除がTrueとFalseがあるということでしょうか?
 発売日テーブルのデータが下記のようであるとすると、

■型番テーブル
ID 型番 数量
1  A   1
2  B   1
3  C   1
4  D   1
5  E   1

■発売日テーブル
ID 型番 発売日    削除
1  A   2010/01/01 True
2  B   2010/05/01 True
3  C   2011/03/01 False
4  D   2011/05/01 True
5  E   2011/06/01 False
6  D   2011/05/01 False
7  A   2011/02/01 False

前回のクエリで型番をグループ化し、発売日を演算で最大値を表示するようにします。
SQLは、
SELECT 型番テーブル.型番, Max(IIf(発売日テーブル!削除=True,Null,発売日テーブル!発売日)) AS 発売日
FROM 型番テーブル LEFT JOIN 発売日テーブル ON 型番テーブル.型番 = 発売日テーブル.型番
GROUP BY 型番テーブル.型番;
となります。これを実行すると、添付ファイルのように表示されます。(同型番で発売日が複数ある場合は、最大の日付が表示)

投稿日時 - 2011-05-10 00:18:17

お礼

お礼が遅くなり、申し訳ございません。

>発売日テーブルのデータは同型番、別発売日で削除が
>TrueとFalseがあるということでしょうか?

はい。TrueとFalseがあり、削除=Falseで抽出することに
より、型番の重複がなくなります。
※誤って登録したような場合、削除がTrueとなるように
 しております。要するに削除=Trueのレコードは不要な
 レコードということになります。


>(同型番で発売日が複数ある場合は、最大の日付が表示)

説明不足ですみません。
発売日テーブルに同型番で複数の発売日は存在しません。
同型番が複数あったとしても、1レコードはFalseでその他は
全てTrueになっております。
要するに、削除=Falseで抽出すれば、同型番で重複する
ことはありません。

投稿日時 - 2011-05-13 13:56:41

ANo.3

型番テーブルの型番と発売日テーブルの型番で結合させ、結合プロパティを型番テーブルの全レコードと発売日テーブルの同じ結合フィールドレコードだけを含めるに設定し、発売日フィールドは“発売日: IIf(発売日テーブル!削除=True,Null,発売日テーブル!発売日) ”と設定します。
SQLは、
SELECT 型番テーブル.型番, IIf(発売日テーブル!削除=True,Null,発売日テーブル!発売日) AS 発売日
FROM 型番テーブル LEFT JOIN 発売日テーブル ON 型番テーブル.型番 = 発売日テーブル.型番;
となります。
このクエリを実行すると添付ファイルのように表示されますが、お求めの実行結果は、このようなものでしょうか?

投稿日時 - 2011-05-07 20:37:02

お礼

ご回答ありがとうございます。
ご教授頂いたSQLで、うまく表示できました。

しかし、実際には数万レコードあるテーブルなのですが、なぜか
レコード数が膨らんでしまう状況です。

例でいうと、型番テーブル全件で35000レコードだとして、発売日テーブルを
紐付けると35500レコードになってしまいます。
発売日テーブルには同型番が重複して登録されている場合がありますが、
片方のレコードは削除がTrueとなっております。

なお、発売日テーブルであらかじめ削除Falseでクエリを作成しておき、
それと型番テーブルを紐つけると、ちゃんと35000レコードとなります。

どのようなことが考えられますでしょうか。

投稿日時 - 2011-05-09 10:46:41

ANo.2

Trueとは削除するということで、

テーブルの削除フィールドが、テキスト型ならば、

SELECT 型番テーブル.型番, IIf([発売日テーブル]![削除]="True","",[発売日テーブル]![発売日]) AS Tmp発売日
FROM 型番テーブル INNER JOIN 発売日テーブル ON 型番テーブル.型番 = 発売日テーブル.型番;



テーブルの削除フィールドが、Yes/No型ならば、

SELECT 型番テーブル.型番, IIf([発売日テーブル]![削除]=Yes,"",[発売日テーブル]![発売日]) AS Tmp発売日
FROM 型番テーブル INNER JOIN 発売日テーブル ON 型番テーブル.型番 = 発売日テーブル.型番;

投稿日時 - 2011-05-06 23:51:45

お礼

ご回答ありがとうございました。
ANo.3のお礼に記載した状況となっております。

投稿日時 - 2011-05-09 10:49:25

ANo.1

SQLビューだと、こんな感じですか。

SELECT 発売日テーブル.型番, IIf([削除]=No,[発売日],"") AS 商品発売日
FROM 型番テーブル INNER JOIN 発売日テーブル ON 型番テーブル.型番 = 発売日テーブル.型番;

抽出されたフィールド名が「発売日」のままだとテーブルのフィールド名と同じになってしまいSQLで循環参照になってしまうので「商品発売日」と変更しています。

投稿日時 - 2011-05-06 20:34:40

お礼

ご回答ありがとうございました。
ANo.3のお礼に記載した状況となっております。

投稿日時 - 2011-05-09 10:49:02

あなたにオススメの質問