環境:Oracle10g
create table SOME_TABLE (NUMDATE Number(8))
create table ANOTHER_TABLE (NUMDATE Number(8))
のようにNumber(8)をYYYYMMDD形式の日付として扱っているテーブルがあった時に
SOME_TABLE.NUMDATEの1ヵ月後 < ANOTHER_TABLE.NUMDATE
という条件で検索したいのですが、思いついたSQLが
SELECT SOME_TABLE.NUMDATE FROM
SOME_TABLE, ANOTHER_TABLE
WHERE
TO_NUMBER(TO_CHAR(ADD_MONTHS(TO_DATE(TO_CHAR(SOME_TABLE.NUMDATE),'YYYYMMDD'),1),'YYYYMMDD')) < ANOTHER_TABLE.NUMDATE
なんだか眩暈がしてきたので自作の関数とか使わない方向でこれをスマートに書くにはどうしたらよいでしょうか?
よろしくお願いします
オラクルを使ったことがないので、一般的なSQLですが、SOME_TABLEとANOTHER_TABLEから日付型の別ビューを作成して、この二つのビューに対して処理をしてはどうでしょうか?
どちらのほうが実行性能が高くなるかは、実際に実験してみないと分かりません。
スマートでないテーブルを設計してしまった時などには、この手を使います。少なくともメンテナンス性は上がります。
オラクルを使ったことがないので、一般的なSQLですが、SOME_TABLEとANOTHER_TABLEから日付型の別ビューを作成して、この二つのビューに対して処理をしてはどうでしょうか?
どちらのほうが実行性能が高くなるかは、実際に実験してみないと分かりません。
スマートでないテーブルを設計してしまった時などには、この手を使います。少なくともメンテナンス性は上がります。
なるほど、VIEWを使う方法ですね。確かに変換ロジックはVIEWに押し込める事が出来るのでよさげですね
ただ、前提を一つ書き忘れていました。
SOME_TABLEは想定1万件
ANOTHER_TABLEは想定1億件いるので
この方法だとパフォーマンス面でちょっと厳しいかもしれません。
Number(8)型をつかう理由は?
Date型とか使えばどうですか?
>TO_NUMBER(TO_CHAR(ADD_MONTHS(TO_DATE(TO_CHAR(SOME_TABLE.NUMDATE),'YYYYMMD>D'),1),'YYYYMMDD')) < ANOTHER_TABLE.NUMDATE
こんなの書いたら、遅くなる元じゃないですか?
>SOME_TABLEは想定1万件
>ANOTHER_TABLEは想定1億件いるので
データの型の妥当性を考察するべきだと思います。
TO_NUMBER、TO_CHAR、ADD_MONTHSして早くなるわけが無いです。
インデックス張っても意味をなさない。
回答ありがとうございます。
>Number(8)型をつかう理由は?
えっと、既に存在している本番運用中のTABLE
(しかも別の開発会社さんの管轄)に対して型変更を行うのは
少し難しいという大人の事情からです。
ストアドファンクションとか関数INDEXを使えばエレガントになる
とは思うのですが、SQLベースでこの「1ヶ月後の算出+型変換」を
スマートに行う方法が無いかと思い、質問させて頂いております。
なるほど、VIEWを使う方法ですね。確かに変換ロジックはVIEWに押し込める事が出来るのでよさげですね
ただ、前提を一つ書き忘れていました。
SOME_TABLEは想定1万件
ANOTHER_TABLEは想定1億件いるので
この方法だとパフォーマンス面でちょっと厳しいかもしれません。