Hatena::ブログ(Diary)

CAMUSのこくばん −クエリの板書所− このページをアンテナに追加 RSSフィード

2017/12/22 どうしても定義域集計関数を使わずに最小値をUPDATEしたかった

8年間ほったらかしてました、このDiary。(苦笑)

SQLなネタはいろいろあったけど、抽象化して書くのがなかなか難しくて放置してます。すみません。

[][]どうしても定義域集計関数を使わずに最小値をUPDATEしたかった

今日は、Access相手に

 TBL_Bを今日更新した場合、そのCOL_Bの最小の値をTBL_AのCOL_Bに反映させたいねん

 ちなみにキーはCOL_Aです。

という要求がありまして、いろいろやったけどダメでした。

こんなの書いたりしたら

UPDATE TBL_A 
SET
  COL_B = (SELECT MIN(COL_B) FROM TBL_B WHERE TBL_A.COL_A = TBL_B.COL_A)
WEHRE EXISTS (SELECT * FROM TBL_B 
               WHERE TBL_B.COL_DATE = #FORMAT(NOW(), 'yyyy/mm/dd')#
                 AND TBL_A.COL_A = TBL_B.COL_A
             ) 

Accessさんにサブクエリだめって怒られ、

また、こんなの書いたら

UPDATE TBL_A INNER JOIN 
       (SELECT COL_A, MIN(COL_B) AS MIN_COL_B FROM TBL_B GROUP BY COL_A) B
             ON TBL_A.COL_A = TBL_B.COL_A
SET
  COL_B = MIN_COL_B
WEHRE EXISTS (SELECT * FROM TBL_B 
               WHERE TBL_B.COL_DATE = #FORMAT(NOW(), 'yyyy/mm/dd')#
                 AND TBL_A.COL_A = TBL_B.COL_A
             ) 

これでもサブクエリダメって怒られるわけです。(サブクエリあかんねんていわれてるから当たり前やがな)

どうしたもんかと思ってたら、Googleさんに神様イター!

 更新クエリで定義域集計関数を使わずに集計する

そう、定義域集計関数を使いたくなかったんです。ADOで動くと思えなかったんで。

その結果、こうなりました。

UPDATE (TBL_A INNER JOIN TBL_B AS B1 ON TBL_A.COL_A=B1.COL_A)
              INNER JOIN TBL_B AS B2 ON B1.COL_A=B2.COL_A
SET
  TBL_A.COL_B = IIF(TBL_A.COL_B > B2.COL_B, B2.COL_B, TBL_A.COL_B)
WEHRE B1.COL_DATE = #FORMAT(NOW(), 'yyyy/mm/dd')#

ばっちしでした。ありがとうございました。