• 締切済み

MAX関数と範囲指定

AのデータをBにコピーをしたいのですが、AからBにうつすときはその日の一番新しいものだけにしたいのです。 例えば、昨日と一昨日のデータの一番新しいやつをコピーしたいのです。今日のデータが入っているので単純にMAXで取り出せないのです。 INSERT INTO B (DATE,NAME,ID) SELECT (DATE,NAME,ID,更新日時) FROM B WHERE DATE = (SELECT MAX(DATE) FROM A WHERE DATE BETWEEN 一昨日 AND 昨日); 根本的に違っているんでしょうか

みんなの回答

  • xKENx
  • ベストアンサー率65% (21/32)
回答No.2

#1さんのおっしゃるようにテーブルの定義があいまいで、特に一意となるキーがわからないのでなんともいえない部分もありますが。 いずれにしても、ご自身で書かれているように"DATE"が同日ごとに最大のレコードを取り出す必要があるため、ひとつのDMLでは難しいのではないでしょうか。日付ごとにループ処理するのが簡単と思います。 PL/SQLでサンプルを書いてみましたので参考になれば。 DECLARE CURSOR C IS SELECT TRUNC("DATE") DATE_MAX FROM A WHERE UPDATED BETWEEN '一昨日' AND '昨日' GROUP BY TRUNC("DATE"); BEGIN FOR R IN C LOOP INSERT INTO B (DATE,NAME,ID) SELECT DATE,NAME,ID FROM (SELECT * FROM A WHERE TRUNC("DATE") = R.DATE_MAX ORDER BY "DATE" DESC ) WHERE ROWNUM = 1 ; END LOOP; COMMIT; END;

すると、全ての回答が全文表示されます。
回答No.1

>根本的に違っているんでしょうか A、Bのテーブルに関すること(カラム等)を説明していないので、 違っているかなんてわからない、というのが感想です。 ただ、はっきりしているのは。 >INSERT INTO B (DATE,NAME,ID) >SELECT (DATE,NAME,ID,更新日時) FROM B >WHERE DATE = (SELECT MAX(DATE) FROM A WHERE DATE >BETWEEN 一昨日 AND 昨日); このSQLは、テーブルAの最大DATEを一件だけ選択し、それをキーに テーブル”B”を拾い出して、テーブルBへ登録します。 ・1件しか選択していない。 ・テーブルAから拾い出さないといけない。 ・拾い出した項目数が3つなのに、登録先のカラムは2つだけ記述。 というところが、おかしいと感じるところです。 あくまで、想像ですが・・ insert into B select * from A where "DATE" in (select "DATE" from A where "DATE" between ~ group by trunc("DATE",'dd'); な感じになるかと思います。 蛇足ですが、"DATE"のような予約語は、カラム名や変数としては、使わない方が良いです。

すると、全ての回答が全文表示されます。

関連するQ&A