人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

スマートなSQLを探しています。
環境: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

なんだか眩暈がしてきたので自作の関数とか使わない方向でこれをスマートに書くにはどうしたらよいでしょうか?
よろしくお願いします


●質問者: ひつじおとこ
●カテゴリ:コンピュータ
✍キーワード:Number SELECT スマート 検索 環境
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● yna1962
●65ポイント ベストアンサー

オラクルを使ったことがないので、一般的なSQLですが、SOME_TABLEとANOTHER_TABLEから日付型の別ビューを作成して、この二つのビューに対して処理をしてはどうでしょうか?

どちらのほうが実行性能が高くなるかは、実際に実験してみないと分かりません。

スマートでないテーブルを設計してしまった時などには、この手を使います。少なくともメンテナンス性は上がります。

◎質問者からの返答

なるほど、VIEWを使う方法ですね。確かに変換ロジックはVIEWに押し込める事が出来るのでよさげですね

ただ、前提を一つ書き忘れていました。

SOME_TABLEは想定1万件

ANOTHER_TABLEは想定1億件いるので

この方法だとパフォーマンス面でちょっと厳しいかもしれません。


2 ● ken33jp
●5ポイント

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ヶ月後の算出+型変換」を

スマートに行う方法が無いかと思い、質問させて頂いております。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ