- ベストアンサー
データ更新についての質問
- テーブルBの最新のステータス更新日のステータスをテーブルAに反映したいがうまくいかない
- UPDATE文とJOINを使用してテーブルBのデータをテーブルAに反映させる処理を行っているが、正しく反映されない
- テーブルBの並び順やJOIN条件の変更を試しても、希望する結果が得られない
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#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 で並びを指定できると思いますが、 更新する時、どういう並びで、どれが最初か 私にはわかりません。
その他の回答 (1)
- 30246kiku
- ベストアンサー率73% (370/504)
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はデータの並び順で最初のものから順に更新していくのではないのですか?
お礼
ありがとうございます。 大変わかりやすくご返答いただき、わたくしにも理解することできました。 更新する際どういう順序で更新されるかはわからないものなのですね。