IBM Informix SQL语法帮助

时间:2013-08-19 16:24:03

标签: sql informix

想知道是否有人可以在这里帮助我一些SQL。我的任务是从遗留数据库系统中检索一些数据 - 它是运行v7.23C1的IBM Informix数据库。这可能是我在这里尝试做的很简单,但对于我的生活我无法理解。

我习惯于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)

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

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

2 个答案:

答案 0 :(得分:2)

在任何情况下,Informix 7.23都是如此老套,以至于仍然无法运行它。目前尚不清楚这是OnLine(Informix Dynamic Server,IDS)还是SE(标准引擎)数据库。然而,7.23是Y2K认证的7.24版本之前的版本,所以它是15岁或左右,可能有点旧。

Informix服务器在7.23时代支持的语法不如当前版本那么全面。因此,你需要小心。你应该有服务器的手册 - 某人,你公司的某个地方应该。如果没有,您需要尝试在IBM Informix网页的墓地手册部分中找到它(从http://www.informix.com/开始以简化URL;但是,古老的手册需要一些发现,但您应该能够获得从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手册(1996年4月 - 17岁),您不能在此版本的Informix中的选择列表中添加(SELECT ...)

您可能必须创建一个包含所需结果的临时表(以及相应的密钥信息),然后从主查询中的临时表中进行选择。

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

答案 1 :(得分:0)

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

相关问题