Access VBA質問箱 IV

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

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


250 / 9994 ←次へ | 前へ→

【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)
)

どうでしょう。
203 hits

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

250 / 9994 ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free