【问题标题】:Informix: Group By Clause Syntax ErrorInformix:按子句语法错误分组
【发布时间】:2011-12-22 04:30:01
【问题描述】:

我有一个 SQL,我试图在 Informix 中运行,但它不断提示“语法错误”或“列 (...) 无法在表中找到..”。

我的查询如下:

SELECT      SLS.STORE, ITM.CLASS, SUM(SLS.SLS_QTY) AS SUM_SLS_QTY, 
            SUM(SLS.SLS_COST) AS SUM_SLS_COST, SUM(SLS.SLS_SELL) AS SUM_SLS_SELL
FROM        SLSDATE SLS, ITEMMST ITM
WHERE       SLS.STORE = '1001' AND SLS.SHORT_SKU = ITM.SHORT_SKU AND 
            SLS.SALES_TRANS_DATE BETWEEN 
                TO_DATE('2011-04-01', '%Y-%m-%d') AND TO_DATE('2011-04-10', '%Y-%m-%d')
GROUP BY    SLS.STORE, ITM.CLASS
ORDER BY    SLS.STORE, ITM.CLASS;

当我运行上面的查询时,informix 说“在查询的任何表中都找不到列(类)(或 SLV 未定义)”。

当我将 ITM.CLASS 更改为 ITM."CLASS"(如下所示)时,它在 GROUP BY 子句处显示语法错误。

SELECT      SLS.STORE, ITM."CLASS", SUM(SLS.SLS_QTY) AS SUM_SLS_QTY, 
            SUM(SLS.SLS_COST) AS SUM_SLS_COST, SUM(SLS.SLS_SELL) AS SUM_SLS_SELL
FROM        SLSDATE SLS, ITEMMST ITM
WHERE       SLS.STORE = '1001' AND SLS.SHORT_SKU = ITM.SHORT_SKU AND 
            SLS.SALES_TRANS_DATE BETWEEN 
                TO_DATE('2011-04-01', '%Y-%m-%d') AND TO_DATE('2011-04-10', '%Y-%m-%d')
GROUP BY    SLS.STORE, ITM."CLASS"
                          ^ syntax error here
ORDER BY    SLS.STORE, ITM."CLASS";

然后我把 GROUP BY 子句改成用数字来表示列,就可以执行了。

SELECT      SLS.STORE, ITM."CLASS", SUM(SLS.SLS_QTY) AS SUM_SLS_QTY, 
            SUM(SLS.SLS_COST) AS SUM_SLS_COST, SUM(SLS.SLS_SELL) AS SUM_SLS_SELL
FROM        SLSDATE SLS, ITEMMST ITM
WHERE       SLS.STORE = '1001' AND SLS.SHORT_SKU = ITM.SHORT_SKU AND 
            SLS.SALES_TRANS_DATE BETWEEN 
                TO_DATE('2011-04-01', '%Y-%m-%d') AND TO_DATE('2011-04-10', '%Y-%m-%d')
GROUP BY    1, 2
ORDER BY    SLS.STORE, ITM."CLASS";

目前我不明白为什么 GROUP BY 子句有问题。

更新 1 itemmst 表架构如下所示

create table 'informix'.itemmst (
    short_sku VARCHAR(13) not null,
    item_desc lvarchar(2000),
    item_del_cd VARCHAR(1),
    item_suppl VARCHAR(10),
    item_suppl_contract VARCHAR(10),
    div VARCHAR(3),
    dept VARCHAR(3),
    CLASS VARCHAR(6),
    ..
)

更新 2 我对 WAS 数据源的一个自定义属性 ifxDELIMIDENT 进行了更改。原来是空白的。所以,我把它改成了真的。重新启动 WAS。而且我无法登录我们的应用程序。 SQLExceptions 由 WAS 引发,但无法查看堆栈跟踪,因为 WAS 已截断最后几行。将属性改回空白后,我能够登录到我们的应用程序。

【问题讨论】:

  • 请提供 SLSDate 和 ItemMST 表(相关部分)的架构。
  • 刚刚用表架构更新了我的问题
  • 感谢架构信息。不能透露服务器版本或平台信息吗?
  • 服务器是 AIX 7,Informix 版本是 11
  • 请注意我的回答中的评论:您需要确定您正在使用的 Informix 版本(在最后一个小数点后的最后一位数字下 - 如果是 11.50.UC9W1X1那是你的版本).

标签: sql select group-by informix


【解决方案1】:

Informix 将单引号和双引号都视为字符串定界符,除非您通过设置 DELIMIDENT 环境变量强制它将双引号视为标记定界标识符。然后字符串在单引号中,分隔标识符在双引号中。 (即使设置了 DELIMIDENT,您仍然可以在所有者名称周围使用单引号或双引号。)

这就是"CLASS" 符号不起作用的原因。

剩余问题似乎是表itemmst 中没有名为class 的列。如果您可以证明它在那里(通过显示itemmst 表的架构),那么我们还有其他问题。您将需要确定您正在使用的 Informix 版本(在最后一个小数点后的最后一位数字下 - 如果是您拥有的版本,则为 11.50.UC9W1X1),以及您运行它的平台。这应该是自动提供的信息,尽管您不是第一个,也可能是最后一个忽略它的人。


逆向工程他人的架构是一项艰巨的工作。但是,有时必须这样做!

CREATE TEMP TABLE slsdate
(
    store               VARCHAR(13) NOT NULL,
    sls_qty             DECIMAL(6,0) NOT NULL,
    sls_cost            DECIMAL(10,2) NOT NULL,
    sls_sell            DECIMAL(10,2) NOT NULL,
    short_sku           VARCHAR(13) NOT NULL,
    sales_trans_date    DATE NOT NULL
);

CREATE TEMP TABLE itemmst
(
    short_sku           VARCHAR(13) NOT NULL,
    item_desc           LVARCHAR(2000),
--    item_del_cd         VARCHAR(1),
--    item_suppl          VARCHAR(10),
--    item_suppl_contract VARCHAR(10),
--    div                 VARCHAR(3),
--    dept                VARCHAR(3),
    CLASS               VARCHAR(6)
);

SELECT      SLS.STORE, ITM.CLASS, SUM(SLS.SLS_QTY) AS SUM_SLS_QTY,
            SUM(SLS.SLS_COST) AS SUM_SLS_COST, SUM(SLS.SLS_SELL) AS SUM_SLS_SELL
FROM        SLSDATE SLS, ITEMMST ITM
WHERE       SLS.STORE = '1001' AND SLS.SHORT_SKU = ITM.SHORT_SKU AND
            SLS.SALES_TRANS_DATE BETWEEN TO_DATE('2011-04-01', '%Y-%m-%d')
                                     AND TO_DATE('2011-04-10', '%Y-%m-%d')
GROUP BY    SLS.STORE, ITM.CLASS
ORDER BY    SLS.STORE, ITM.CLASS;

当我在 MacOS X 10.7.2(使用 SQLCMD 87.02 和 CSDK 3.70.FC2)上针对 IDS 11.70.FC2 运行它时,我没有收到任何错误(也没有数据,但是我没有在任何一个表中插入任何数据) .

您使用哪种语言将此 SQL 导入数据库?

【讨论】:

  • 我们使用的是在 Wepshere 中运行的 Java
  • 我正在尝试设置 DELIMIDENT 变量,但不确定在哪里设置。
  • 也不是我;我可以拼写 JDBC:它是一个 E、一个 S、一个 Q、一个 L、一个斜线和一个 C,不是吗?我可以运行 Java 编译器……哦,不;那是一个C编译器。它可能是一个连接属性;它可能需要在建立 JDBC 连接时在客户端环境中进行设置。 JDBC 文档中可能有关于如何设置它的内容。
  • 请注意@JonathanLeffler 的答案在数据库服务器的操作系统中设置了 DELIMIDENT 环境变量时有效。尝试此操作时,我们能够毫无问题地进行查询。但是当从 App Server (WAS) 执行查询时,问题仍然存在。设置 WAS 的数据源属性“ifxDelimident”,我们无法登录到我们的应用程序,因为我们发现当这个属性设置为 true 时,它​​在 Informix(或 JDBC 驱动程序)中打开了区分大小写的功能。我们在 Informix 中定义的表名和列名都是小写的。而且我们应用中的SQL语句都是大写的。
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多