スマートな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

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

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/04/18 19:07:15
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:yna1962 No.1

回答回数26ベストアンサー獲得回数3

ポイント65pt

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

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

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

id:hituziotoko

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

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

SOME_TABLEは想定1万件

ANOTHER_TABLEは想定1億件いるので

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

2008/04/12 00:46:21

その他の回答1件)

id:yna1962 No.1

回答回数26ベストアンサー獲得回数3ここでベストアンサー

ポイント65pt

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

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

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

id:hituziotoko

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

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

SOME_TABLEは想定1万件

ANOTHER_TABLEは想定1億件いるので

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

2008/04/12 00:46:21
id:ken33jp No.2

回答回数928ベストアンサー獲得回数13

ポイント5pt

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して早くなるわけが無いです。

インデックス張っても意味をなさない。

id:hituziotoko

回答ありがとうございます。

>Number(8)型をつかう理由は?

えっと、既に存在している本番運用中のTABLE

(しかも別の開発会社さんの管轄)に対して型変更を行うのは

少し難しいという大人の事情からです。

ストアドファンクションとか関数INDEXを使えばエレガントになる

とは思うのですが、SQLベースでこの「1ヶ月後の算出+型変換」を

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

2008/04/14 17:28:09
  • id:hituziotoko
    回答ありがとうございました
    こっそりOTNにもマルチポストしていましたが
    alter session set nls_date_format='yyyymmdd';
    で日付文字列の指定を省略するぐらいしか
    SQLベースでこれ以上スマートな方法は存在しないようです。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません