Microsoft Access 掲示板

クエリを使って条件に当てはまる日付を抽出したい / 5

10 コメント
views
4 フォロー
5
mayu 2019/10/27 (日) 08:15:03 修正 76b28@61ad5

> ご回答いただいたように複数の条件を全て網羅するようにテーブル構成を変更すると、
> 「月」、「日付」等の並列する条件を追加した際に
> 条件テーブルが長大なものになってしまうため

 
「月」や「日付」の条件をテーブルに追加して長大になるというのは
意味がわかりかねます。
前回の回答で、私はフィールド構成の変更を提案したわけではなく
データの持ち方を変更するよう、示唆したに過ぎません。

したがって、ご自身が考える「 長大にならない 」設計方針と
「月」や「日付」をどのような構成でデータ登録し、
週次や曜日毎に実施するデータと同居させる予定なのか
また、どのような SQL で抽出を行うつもりでいるのか、構想をお聞かせ願えますか。

> [1]については現在のテーブル構成のまま目的の抽出結果を得られる方法を求めております。

 
現状の構成は、以下の問題点が明白ですので

 ・ 第三者から見て、単一の行からテーブルのデータ構造が把握できない
 ・ 相関サブクエリというのは、莫大な演算回数が発生するパフォーマンスの悪い SQL である
 ・ 複雑なサブクエリを複数回発行しても、思ったようにデータが抽出できていない
 ・ 演算フィールドを左辺に指定して抽出条件を指定しているため、インデックスが効かない

運用も構築も この先 地獄を見る覚悟がおありということでしたら
一応、ご希望の回答はしておきます。

なお、週番号だけを指定するリマインダーが あるのかどうか不明ですが
とりあえず、どちらでもいいように冗長な SQL にしておきます。
以下の結果を ユニオンクエリで rookjimさん記載の SQL と結合すればいいでしょう。

SELECT x.リマインダーID
     , z.日付
     , y.曜日番号
     , y.週番号
FROM 
(
    SELECT リマインダーID
      FROM T条件
    GROUP BY リマインダーID
    HAVING Sum( 週番号 )   = 0
        OR Sum( 曜日番号 ) = 0 
)
         x
, T条件  y
, T日付  z
WHERE x.リマインダーID = y.リマインダーID
  AND ( 
         y.曜日番号 = Weekday( z.日付 )
             OR
         y.週番号   = ( Day( z.日付 ) + 6 ) \ 7
      )
ORDER BY 1, 2 ;

 

> または
> ・条件を網羅したテーブルのデータが作成できるようにフォームを再設計する
> ・T条件のデータを複数の条件を全て網羅するように変換するようクエリを作成する
> 等で解決できるかと思うのですが、
> こちらについても具体的な方法をアドバイスいただけますと幸いです。

 
具体的なアドバイスをご希望なら、まずは データベースソフトの扱いにおいて
rookjimさんの方針や考え方は、順番や方向性が真逆である
ということを理解いただかない限り、不毛なやりとりになるでしょう。

> ・条件を網羅したテーブルのデータが作成できるようにフォームを再設計する

のではなく、構築手順は

  1. 条件を網羅した適切な構造のテーブルを設計する
  2. パフォーマンスや見通しの良い SQL を考える
  3. VBAの利用やコントロールの配置は必要最小限に抑え、
    シンプルで保守性の高いインターフェース( フォーム・レポート )の構築を目指す

になります。

添付画像における リマインダーID: 1 の内容においても
発生条件が「 第2、第4土曜日 」ですから
フォーム上で [ 指定日 ] [ 日 ] といった項目を ユーザが指定する必要は無いように思いますが
代替値を入力しない限り、テーブル上でそれらの項目は Null になります。
これらの項目を SQLでどう扱うか、見通しが立っていないのでしたら
テーブルの設計から見直す必要があり、当然、フォームも改変を余儀なくされます。

まずは、テーブル設計からやり直す気が有るのか否か、意思表示をお願いします。

通報 ...