#1です
SELECT b.*, a.* FROM
a INNER JOIN b ON (a.顧客コード = b.顧客コード) AND (a.登録日 = b.登録日);
の結果は以下の様になると思います。
b.顧客コード b.登録日 b.ステータス b.ステータス更新日 a.顧客コード a.登録日 a.ステータス
1 2012/02/02 4 2012/02/08 1 2012/02/02
1 2012/02/02 3 2012/02/06 1 2012/02/02
1 2012/02/02 2 2012/02/04 1 2012/02/02
1 2012/02/02 1 2012/02/03 1 2012/02/02
1 2012/01/01 3 2012/01/04 1 2012/01/01
1 2012/01/01 2 2012/01/02 1 2012/01/01
1 2012/01/01 1 2012/01/01 1 2012/01/01
で、b.ステータス更新日 が最新の b.ステータス が欲しいので、
抽出条件でテーブル b の「顧客コード」と「登録日」が同じで
「ステータス更新日」が最新の(Max で指定)日付を求めています
この求める時に
WHERE b.ステータス更新日 In
(SELECT Max(ステータス更新日) FROM b
WHERE (b.顧客コード = b.顧客コード) AND (b.登録日 = b.登録日))
のままでは、何が何だかわけわからないので、
FROM b のところで FROM b AS c と、テーブル名を置き換えておいて
WHERE b.ステータス更新日 In
(SELECT Max(ステータス更新日) FROM b AS c
WHERE (c.顧客コード = b.顧客コード) AND (c.登録日 = b.登録日))
とします(相関サブクエリと言うものらしいです)
テーブル b 内を b のものを使ってと考えていましたが以下でも良いみたいです
(テーブル b 内を a のものを使って)
WHERE b.ステータス更新日 In
(SELECT Max(ステータス更新日) FROM b
WHERE (b.顧客コード = a.顧客コード) AND (b.登録日 = a.登録日))
SELECT b.*, a.* FROM
a INNER JOIN b ON (a.顧客コード = b.顧客コード) AND (a.登録日 = b.登録日)
WHERE b.ステータス更新日 In
(SELECT Max(ステータス更新日) FROM b AS c
WHERE (c.顧客コード = b.顧客コード) AND (c.登録日 = b.登録日));
この表示結果は
b.顧客コード b.登録日 b.ステータス b.ステータス更新日 a.顧客コード a.登録日 a.ステータス
1 2012/02/02 4 2012/02/08 1 2012/02/02
1 2012/01/01 3 2012/01/04 1 2012/01/01
になります。
なお、
WHERE b.ステータス更新日 In
部分は
WHERE b.ステータス更新日 =
でも良いかと思います
> また、ACCESSはデータの並び順で最初のものから
抽出する際には ORDER BY で並びを指定できると思いますが、
更新する時、どういう並びで、どれが最初か 私にはわかりません。
UPDATE a INNER JOIN b ON (a.顧客コード = b.顧客コード) AND (a.登録日 = b.登録日)
SET a.ステータス = b.ステータス
WHERE b.ステータス更新日 In
(SELECT Max(ステータス更新日) FROM b AS c
WHERE (c.顧客コード = b.顧客コード) AND (c.登録日 = b.登録日));
で、どうなりますか
質問者
お礼
ありがとうございます。
いただいたものをコピーし、クエリーを実行し、希望通りの結果になりました。
が、
WHERE b.ステータス更新日 In
(SELECT Max(ステータス更新日) FROM b AS c
WHERE (c.顧客コード = b.顧客コード) AND (c.登録日 = b.登録日));
のところがいまいち理解できていません。
いきなりcが出てきているところなど。
初歩的な質問になるかもしれませんが、よろしくお願いいたします。
また、ACCESSはデータの並び順で最初のものから順に更新していくのではないのですか?
お礼
ありがとうございます。 大変わかりやすくご返答いただき、わたくしにも理解することできました。 更新する際どういう順序で更新されるかはわからないものなのですね。