- ベストアンサー
アクセスのユニオンクエリの修正方法について
- アクセス初心者の方に向けて、ユニオンクエリの修正方法をご紹介します。質問文章では、日付設定以外のデータも含まれる問題が発生しています。
- 条件を正しく設定するためには、商品が指定の種類であり、かつお届け日が指定の範囲内にあることが必要です。
- 正しい日付範囲を抽出するには、条件文の結合順序を調整し、括弧を使用して条件をグループ化する必要があります。具体的な修正方法についてご説明します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ANDとORの優先順位に注意して下さい。 WHERE [商品] = 'バニラ' OR [商品] = 'チョコ' OR [商品] = 'イチゴ' OR [商品] = 'バナナ' AND [お届け日] between Date()-180 and Date()+30 これの意味は 「商品がバニラ」または「商品がチョコ」または「商品がイチゴ」または「商品がバナナで、かつ、お届け日が180日前から30日後」 です。 「バニラ」「チョコ」「イチゴ」に関しては「日付が何時だろうと構わず抽出される」と言う事です。 SELECT * FROM データ WHERE ([商品] = 'バニラ' OR [商品] = 'チョコ' OR [商品] = 'イチゴ' OR [商品] = 'バナナ') AND [お届け日] between Date()-180 and Date()+30 UNION SELECT * FROM データ WHERE [商品] = 'ヨーグルト' AND [産地] LIKE '*北海道*' AND [お届け日] between Date()-180 and Date()+90; のように括弧を付けて 「商品がバニラまたはチョコまたはイチゴまたはバニラで、かつ、お届け日が180日前から30日後」 と解釈されるようにして下さい。 こういう「または(OR)」や「かつ(AND)」は、括弧の有無で意味が全然違ってしまいます。 なお、こういう「1つのテーブルから、色々な条件で抽出する場合」は、条件をORで併記すれば良く、UNIONクエリにする必要はありません。 SELECT * FROM データ WHERE (([商品] = 'バニラ' OR [商品] = 'チョコ' OR [商品] = 'イチゴ' OR [商品] = 'バナナ') AND [お届け日] between Date()-180 and Date()+30) OR ([商品] = 'ヨーグルト' AND [産地] LIKE '*北海道*' AND [お届け日] between Date()-180 and Date()+90); と書くか SELECT * FROM データ WHERE ((([商品] = 'バニラ' OR [商品] = 'チョコ' OR [商品] = 'イチゴ' OR [商品] = 'バナナ') AND [お届け日] <= Date()+30) OR ([商品] = 'ヨーグルト' AND [産地] LIKE '*北海道*' AND [お届け日] <= Date()+90)) AND [お届け日] >= Date()-180 と書きましょう。
その他の回答 (1)
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは 試してないいですけど、 WHERE ([商品] = 'バニラ' OR [商品] = 'チョコ' OR [商品] = 'イチゴ' OR [商品] = 'バナナ') AND ([お届け日] >= Date()-180 and [お届け日] <= Date()+30) みたいな感じとか?
お礼
お礼が遅くなり大変失礼いたしました。 回答ありがとうございました。 まだ不要なデータが入ってしまうようです。。 でも大変参考になりました。
お礼
お礼が遅くなり大変失礼しました。 いただいたアドバイスをもとに修正してみましたら、対象データのみ抽出することが出来ました! カッコ、の使用方法については初めて知ることで、クエリの奥深さを勉強するいい機会になりました。 また、今回は既存クエリの修正なので引き続きユニオンクエリを使う予定なのですが、今後このような場合は通常クエリでいいことも教えていただき感謝しています。 本当にありがとうございました!