2

必要なフィールドの 1 つが別のテーブルを介して間接的に指定されているため (つまり、;

SELECT ... FROM BIGTABLE WHERE KFIELD = 123

ミリ秒で実行されますが、

SELECT ... FROM BIGTABLE, LTLTBL WHERE KFIELD = LTLTBL.LOOKUP 
   AND LTLTBL.UNIQUEID = 'STRINGREPOF123'

30 ~ 40 秒かかります。

基本的にこれを可能にする関数を使用して、この最初の問題を回避することができました。

SELECT ... FROM BIGTABLE WHERE KFIELD = MYFUNC('STRINGREPOF123')

これもミリ秒で実行されます。

ただし、問題は、このアプローチは返される値が 1 つの場合にのみ機能することですが、MYFUNCT2 つまたは 3 つの値が返される場合もあります。

私はそのSQLを知っています

SELECT ... FROM BIGTABLE WHERE KFIELD IN (123,456,789)

また、ミリ秒単位で返されるので、単一の値ではなく、可能な値のリストを返す関数が必要です-これは可能ですか?

悲しいことに、アプリケーションは Sybase ASA 9 で実行されています。はい、それが古く、更新される予定であることはわかっていますが、今は何もできないので、このバージョンの DB で動作するロジックが必要です。

4

1 に答える 1

1

数値を格納するために一時テーブルを使用するのはどうですか? したがって、SQLは次のようになります。

    select kfield into #tmpKfield 
    from littleTable 
    where UNIQUEID = 'STRINGREPOF123'

    select * from bigTable 
    where kfield in (select kfield from #tmpKfield)
    go

    drop table #tmpKfield
    go

それが私があなたの問題を解決しようとする方法です。

于 2011-07-20T14:14:29.470 に答える