Accessのクエリについて教えてください。テーブル1、テーブル2があります。

テーブル1にはID、日付1(フィールド)があり、テーブル2にはID2、日付2、携帯があります。

選択クエリでID1とID2はリレーションを貼りました。
日付1、日付2の値がイコールのもの、かつ携帯フィールドがブランクでないものを
抽出したいです。ただし日付1、日付2では日付フォーマットが別々です。
日付1では、yyyymmdd、日付2ではyyyy/mm/ddです。これらを考慮してどのように
抽出条件を指定すればよいでしょうか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/12/24 11:01:57
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:frkw2004 No.1

回答回数194ベストアンサー獲得回数21

ポイント35pt

Select * From テーブル1 Inner Join テーブル2

On テーブル1.ID1 = テーブル2.ID2

AND テーブル1.日付1 = Format(テーブル2.日付2,"YYYYMMDD")

Where テーブル2.携帯 is not NULL and テーブル2.携帯<>""

これでいけると思いますが、このSQLではテーブル2にあってテーブル1にはないデータについては抽出されません。このデータを抽出するには

Select * From テーブル2 Left Join テーブル1

On テーブル2.ID2 = テーブル1.ID1

AND Format(テーブル2.日付2,"YYYYMMDD")=テーブル1.日付1

Where テーブル1.ID1 is NULL

になります。

id:akaired

SQL教えていただきありがとうございます。現在、デザインビューでクエリを作成するからクエリを作っています。format関数ですが、抽出条件の所に、=Format([日付1],'yyyymmdd')といった形で入力すればよいのでしょうか?これをやると日付1のデータが空になります。

2009/12/22 13:47:17

その他の回答1件)

id:frkw2004 No.1

回答回数194ベストアンサー獲得回数21ここでベストアンサー

ポイント35pt

Select * From テーブル1 Inner Join テーブル2

On テーブル1.ID1 = テーブル2.ID2

AND テーブル1.日付1 = Format(テーブル2.日付2,"YYYYMMDD")

Where テーブル2.携帯 is not NULL and テーブル2.携帯<>""

これでいけると思いますが、このSQLではテーブル2にあってテーブル1にはないデータについては抽出されません。このデータを抽出するには

Select * From テーブル2 Left Join テーブル1

On テーブル2.ID2 = テーブル1.ID1

AND Format(テーブル2.日付2,"YYYYMMDD")=テーブル1.日付1

Where テーブル1.ID1 is NULL

になります。

id:akaired

SQL教えていただきありがとうございます。現在、デザインビューでクエリを作成するからクエリを作っています。format関数ですが、抽出条件の所に、=Format([日付1],'yyyymmdd')といった形で入力すればよいのでしょうか?これをやると日付1のデータが空になります。

2009/12/22 13:47:17
id:kn1967 No.2

回答回数2915ベストアンサー獲得回数301

ポイント35pt
SELECT T1.*, T2.*
FROM テーブル1 AS T1, テーブル2 AS T2
WHERE (T1.ID1 = T2.ID2)
    AND (T1.日付1 = Replace(T2.日付2, "/", ""))
    AND (trim(T2.携帯) <> "");

※日付1も日付2もテキスト型なのでFORMATは使えません。

 (一度数値あるいは日付型に変換してからだから面倒)

※Accessのバージョンを聞き忘れましたが

 2000ではReplace関数はクエリ内では使えませんので、

 標準モジュールに自作関数を作って呼ぶという手になります。

※数字は全て半角で書いてありますので、実際のものにあわせてください。

※動作確認はしてません。あしからず。

id:akaired

ありがとうございます、できました!

2009/12/24 10:53:51
  • id:kn1967
    (不明点1)
    日付フォーマット(表示形式)がバラバラという事ですが、
    データ型はどうなってますか?
    双方ともに日付型なのか、一方はテキスト型だとか、
    あるいは両方テキスト型だとか・・・
    (不明点2)
    日付に関しては1対1や1対多の関係にあるのでしょうか?
    それとも多対多ですか? 
    そんなこと考えずに、ただ総当りで考えればいいのでしょうか?
  • id:akaired
    不明点1:全てテキスト型です。Format関数を使ってなおせばいいと思うのですが、
    Format([日付1],'yyyymmdd')と抽出条件に入力してもうまく動きません。

    不明点2:総当りでよいです。よろしくお願いします。
  • id:kn1967
    >テキスト型なのでFORMATは使えません。
    > (一度数値あるいは日付型に変換してからだから面倒)

    これは大変な間違いです。
    申し訳ないですが、この2行は無視してください。

    SQLはデザインビューではなくSQLビューに直接記述してください。
    その後、デザインビューに切り替えれば、
    どこにどのように記述すれば、そうなるのかも判ります。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません