Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


87 / 2272 ツリー ←次へ | 前へ→

【13057】抽出(AND)がうまくいきません ガリクソン 16/7/28(木) 10:54 質問[未読]
【13058】Re:抽出(AND)がうまくいきません hatena 16/7/29(金) 1:05 回答[未読]
【13059】Re:抽出(AND)がうまくいきません ガリクソン 16/8/8(月) 16:40 お礼[未読]

【13057】抽出(AND)がうまくいきません
質問  ガリクソン  - 16/7/28(木) 10:54 -

引用なし
パスワード
   基本的な事かもしれませんが、抽出が上手くいかないのでご教示お願いします

SELECT Year([日付])+(Month([日付])<4) AS 式1, クエリA.IDコード
FROM クエリA
WHERE (((Year([日付])+(Month([日付])<4))>=Year(Date())+(Month(Date())<4)) AND ((クエリA.IDコード) Between 1 And 10)) OR (((クエリA.IDコード)=13) OR (((クエリA.IDコード)=15)) OR (((クエリA.IDコード)=25))
ORDER BY クエリA.IDコード;

本年度分のIDコード1〜10,13,15,25を抽出したいのですが
なぜか2015年度の1月以降の分まで抽出されてしまいます

年度初めは毎年4月です

どこがおかしいのかご指摘よろしくお願い申し上げます

【13058】Re:抽出(AND)がうまくいきません
回答  hatena  - 16/7/29(金) 1:05 -

引用なし
パスワード
   括弧のネストがおかしいようです。
不必要な括弧があるとネストの深さがどうなっているのか見づらいので、
必用最低限の括弧のみにしましょう。
あと改行と字下げを適切に入れるとより見やすいでしょう。

現状の条件は下記のようなネストになっています。

WHERE
(
 ((Year([日付])+(Month([日付])<4))>=Year(Date())+(Month(Date())<4))
  AND ((クエリA.IDコード) Between 1 And 10)
)
OR
(
 ((クエリA.IDコード)=13)
 OR (((クエリA.IDコード)=15))
 OR (((クエリA.IDコード)=25)
)

IDコード 13,15,25 には年度制限がかからず全件表示されてしまいます。


下記のような条件になるようにすべきです。

WHERE
(
 Year([日付])+(Month([日付])<4)>=Year(Date())+(Month(Date())<4)
)
AND
(
 クエリA.IDコード Between 1 And 10
 OR クエリA.IDコード=13
 OR クエリA.IDコード=15
 OR クエリA.IDコード=25
)

このように必用最低限の括弧にして、改行と字下げを適切に入れると
見やすくなり間違いも回避できます。


さらに、いうと、

Year([日付])+(Month([日付])<4)

というようにフィールドを関数の引数にしてしまうとインデックスが
利用できないので件数が多いと重くなります。
フィールドはそのままにして右辺の方をうまく工夫するとインデックスが
利用できて処理が高速になります。
あと In演算子も利用するとシンプルになります。

WHERE
(
 日付 >= DateSerial(Year(Date())+(Month(Date())<4),4,1)
)
AND
(
 クエリA.IDコード Between 1 And 10
 OR クエリA.IDコード In (13,15,25)
)

どうでしょう。

【13059】Re:抽出(AND)がうまくいきません
お礼  ガリクソン  - 16/8/8(月) 16:40 -

引用なし
パスワード
   ▼hatena さん:
ご回答ありがとうございます
教えて頂いた通りにしたらうまくいきました
お礼が遅くなって申し訳ありませんでした
ありがとうございました

87 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078186
(SS)C-BOARD v3.8 is Free