ショボ短歌会

Access 2007 (+VB 2013) で動作させるプログラムを作っています。

[]で囲んだ項目はNot Null制約

tableA
[ID] [Name]
1 大野
2 池田
3 渡邊


tableB
[ID] [subID] [ImagePath] ※
1 1 c:\Image001.jpg (日付A)
1 2 c:\Image002.jpg (日付B)
1 3 c:\Image003.jpg (日付C)
3 1 c:\Image031.jpg {Null}

注 tableB に 池田さんのデータは無し
注 (日付A)は仕様上でこの日より前の日付は指定できないこととする。(NULL でできるのであればNULL)

のようなテーブルがあり、 tableA と tableB は IDで外部結合してるとします。

その時、
大野さんのある指定した日付のImagePathを取りたいとします。
(もちろん、最終的には3人とも。人が増えれば全員対象)

それでその日付の対象を
(1) 日付 が 日付A <= 日付 <日付B
(2) 日付 が 日付B <= 日付 <日付C
(3) 日付 が 日付C <= 日付
(4) Null の値がセットされている場合は、日付に関係なく一律
(5) もともとない人に対してはかえってこない
に対するImagePathを取得したいのですが、

※の列を 期間の始点とするべきか終点とするべきかも含めて
良いSQLの組み方を教えていただければと思います。

Access2007という環境が維持できればもっと根本から変えた設計でもかまいません。

よろしくお願いします。

A 回答 (1件)

やりたいことは「名前と日付を指定し、指定した日に表示する画像のパスを得る」ということですよね?


で、項目※については「指定した日付より小さい物のうちの最大値」ということだと思います。これは複問い合わせにMAXを使うことで行けるように思いますがいかがしょう。
あとnullの考慮ですね。日付指定の無い方の場合、項目※にnullを入れておくのか、最小値を入れておくのかのデータ仕様上の判断ですか。

授業の課題なのかお仕事なのかは分かりませんが、SQL化はご自身でお考えください。
INNER JOINを使う方法もあるのかな? どうなのかな?

参考まで。
    • good
    • 1
この回答へのお礼

ヒントありがとうございます。
NULLを仕様上の一番過去 (2000/1/1)として、
TableA の Name 列は 予約語なので Namaeに変えて、
ID = 1 の人 の 2015/12/31 を 渡すときは

SELECT A.ID, B.subID, B.ImagePath, IIF(B.DateFrom = NULL , #1/1/2000# , B.DateFrom)
FROM tableA as A INNER JOIN tableB as B ON A.ID = B.ID
WHERE A.ID = 1 and B.DateFrom = (SELECT max(DateFrom)
FROM tableB
WHERE tableB.DateFrom <= #12/31/2015#) で行けた!

と思ったら TableB の IDによらず、一番未来日を超えると戻らくなってしまいました・・・もうちょっと考えます。

ちなみに、課題でも仕事でもありませんですけどね。

お礼日時:2016/03/31 22:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!