Informix: синтаксическая ошибка группировки по пунктам - PullRequest
1 голос
/ 22 декабря 2011

У меня есть 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.Первоначально это было пустым.Итак, я изменил это на истину.Перезапущен был.И я не мог войти в наше приложение.SQLExceptions были выброшены WAS, но не смогли увидеть трассировку стека, потому что WAS урезал последние несколько строк.После изменения свойства обратно на пустое я смог войти в наше приложение.

1 Ответ

1 голос
/ 27 декабря 2011

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;

Когда я запускаю это для IDS 11.70.FC2 в MacOS X 10.7.2 (с использованием SQLCMD 87.02 и CSDK 3.70.FC2), я не получаю никаких ошибок (данных тоже нет, но затем я не вставлял их ни в одну таблицу) .

Какой язык вы используете для передачи этого SQL в базу данных?

...