0

想知道是否有人可以在这里帮助我处理一些 SQL。我的任务是从遗留数据库系统中检索一些数据——这是一个运行 v7.23C1 的 IBM Informix 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”这样的值,我想包含一个嵌套字段,它将运行查询以获取给定日期范围内的销售额。我确信我可以将它们单独放在一起,但是在完全执行时似乎无法让编译器对我的代码感到满意。

可能类似于(注意,此特定查询是针对另一列的,但您明白了):

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)

让事情变得更糟的是我无法访问运行该数据库的服务器。目前,我有一个自定义 C# 应用程序,它通过 ODBC 驱动程序连接并执行原始 SQL,将结果解析回 .CSV。

任何和所有的帮助表示赞赏!

4

2 回答 2

2

在任何情况下,Informix 7.23 都太老了,继续运行它是不友好的。目前尚不清楚这是一个 OnLine(Informix Dynamic Server,IDS)还是 SE(Standard Engine)数据库。但是,7.23 是 Y2K 认证的 7.24 版本之前的版本,所以它有 15 年左右的历史,可能更早一些。

Informix 服务器在 7.23 时代支持的语法不如当前版本全面。因此,您需要小心。你应该有服务器的手册——你公司的某个人应该有。如果没有,您需要尝试在 IBM Informix 网页的墓地手册部分中找到它(为了 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 的 server SQL Syntax 才能知道是否允许。AFAICR,OnLine(Informix 动态服务器)将允许它,而 SE 可能不会,但这远非确定性。我根本不记得那个古老的版本有什么限制。


从 7.2 Informix Guide to SQL: Syntax手册(日期为 1996 年 4 月 — 17 岁)判断,您不能(SELECT ...)在此版本的 Informix 中将 a 放入选择列表中。

您可能必须创建一个临时表来保存您想要的结果(以及适当的关键信息),然后在主查询中从临时表中进行选择。

这种事情是长时间不更新服务器的问题之一。

于 2013-08-19T16:34:20.273 回答
0

很抱歉直言不讳,但您至少可以通过缩短语法来怜悯我们吗?... table.columns 可以呈现为别名。同时,如果您无法升级到较新版本的 Informix,您将不得不依赖一个或多个 SELECT INTO 临时表查询来实现您的目标,顺便说一句,这将使您的编码在不同版本之间更具可移植性。您还必须评估使用 TEMP 表是否意味着不可接受的处理时间。

于 2013-08-20T21:23:16.697 回答