0

ここでSQLを手伝ってくれる人がいるかどうか疑問に思っています。私は、レガシー DB システムからデータを取得する任務を負っています。これは、v7.23C1 を実行している IBM Informix DB です。ここで私がやろうとしていることはかなり単純かもしれませんが、私の人生ではそれを理解することはできません.

私は他の DB システムではなく、MS SQL Server に慣れていますが、これはかなり古いようです: http://publib.boulder.ibm.com/epubs/pdf/3731.pdf (?)

基本的に、ネストを含むクエリを実行したいだけですが、これを行う方法がわかりません。たとえば、次のようなクエリがあります。

SELECT cmprod.cmp_product, 
 (stock.stk_stkqty - stock.stk_allstk) stk_bal, 
    stock.stk_ospurch, 
    stock.stk_backord,
    'Current Sales Period',
    'Current Period -1',
    'Current Period -2',
    cmprod.cmp_curcost,
    stock.stk_credate,
    stock.stk_lastpurch,
    stock.stk_binref
FROM informix.stock stock,
     informix.cmprod cmprod
WHERE stock.stk_product = cmprod.cmp_product
   AND (cmp_category = 'VOLV'
   OR cmp_category = 'VOLD'
   OR cmp_category = 'VOLA')
   AND stk_loc = 'ENG';

ここで、基本的に「現在の期間 -1」のような値がある場所に、特定の日付範囲内の売上を取得するクエリを実行するネストされたフィールドを含めたいと考えています。それらを別々にまとめることができると確信していますが、完全に実行されたときにコンパイラが私のコードに満足するようには見えません。

おそらく次のようなものです(NB、この特定のクエリは別の列に対するものですが、アイデアはわかります):

SELECT s.stmov_product, s.stmov_trandate, s.stmov_qty
FROM informix.stmove s
WHERE s.stmov_product = '1066823'
AND s.stmov_qty > 0
AND s.stmov_trandate IN (
     SELECT MAX(r.stmov_trandate) 
     FROM informix.stmove r
     WHERE r.stmov_product = '1066823'
     AND r.stmov_qty > 0)

さらに悪いのは、この DB が実行されているサーバーにアクセスできないことです。現時点では、ODBC ドライバーを介して接続し、生の SQL を実行し、結果を解析して .CSV に戻すカスタム C# アプリがあります。

ありとあらゆる助けに感謝します!

4

2 に答える 2

2

どのような状況でも、Informix 7.23 は非常に古くなっているため、それを実行し続けるのは不親切です。これが OnLine (Informix Dynamic Server、IDS) データベースか SE (Standard Engine) データベースかは明らかではありません。ただし、7.23 は Y2K 認定の 7.24 リリースよりも前のバージョンなので、15 年ほど前のバージョンで、おそらく少し古いものです。

7.23 の時代に Informix サーバーでサポートされていた構文は、現在のバージョンほど包括的ではありませんでした。そのため、注意が必要です。サーバーのマニュアルを用意する必要があります — 会社のどこかの誰かがそうすべきです。そうでない場合は、IBM Informix の Web ページ ( URL を簡単にするためにhttp://www.informix.com/から開始) の墓場のマニュアル セクションで見つける必要があります。 http://pic.dhe.ibm.com/infocenter/ifxhelp/v0/index.jspからLHS で「サーバー」を選択してアクセスできるはずです)。

あなたが書き込もうとしている場合:

SELECT ...
       (SELECT ... ) AS 'Current - 1',
       (SELECT ... ) AS 'Current - 2',
       ...
  FROM ...

次に、7.23 のサーバー SQL 構文を調べて、それが許可されているかどうかを確認する必要があります。AFAICR、OnLine (Informix Dynamic Server) はそれを許可し、SE はおそらく許可しないでしょうが、それは決定的なものにはほど遠いものです。その古いバージョンの制限が何であったかは覚えていません。


7.2 Informix Guide to SQL: Syntax(SELECT ...)マニュアル (日付は 1996 年 4 月 — 17 年前) から判断すると、このバージョンの Informix では選択リストにa を入れることはできません。

必要な結果を (適切なキー情報と共に) 保持する一時テーブルを作成し、メイン クエリで一時テーブルから選択する必要がある場合があります。

この種のことは、サーバーを長期間更新しないことによる問題の 1 つです。

于 2013-08-19T16:34:20.273 に答える
0

率直で申し訳ありませんが、少なくとも構文を短くすることで私たちを憐れんでいただけますか?.. table.columns はエイリアスとして提示できます。一方、Informix の新しいバージョンにアップグレードできない場合は、目的を達成するために 1 つ以上の SELECT INTO 一時テーブル クエリに依存する必要があります。これにより、異なるバージョン間でのコーディングの移植性が向上します。また、TEMP テーブルを使用することが許容できない処理時間を意味するかどうかを評価する必要があります。

于 2013-08-20T21:23:16.697 に答える