我有一个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。我无法登录我们的应用程序。 WAS抛出了SQLExceptions,但由于WAS截断了最后几行,因此无法看到堆栈跟踪。将属性更改为空白后,我可以登录到我们的应用程序。
答案 0 :(得分:1)
Informix将单引号和双引号视为字符串分隔符,除非您通过设置DELIMIDENT环境变量强制它将双引号视为标记分隔标识符。然后字符串用单引号括起来,分隔的标识符用双引号括起来。 (即使设置了DELIMIDENT,您仍然可以使用所有者名称左右单引号或双引号。)
这就是"CLASS"
符号不起作用的原因。
剩余问题似乎是表class
中没有名为itemmst
的列。如果您可以证明它存在(通过显示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引入数据库?