Ошибка объединения запросов AS400/Excel ODBC

У меня возникли проблемы с обработкой запроса в Excel для нашей системы AS400/DB2.

Я пытаюсь использовать две разные таблицы с разной информацией, но возвращаю проход/слот в одном и том же столбце на основе определенного идентификатора SKU/Customer ID (Storer). Я думал, что UNION будет работать, но я получаю сообщение «SQL0802 — ошибка преобразования или сопоставления данных» при попытке выполнить запрос.

Вот что у меня есть прямо сейчас:

SELECT ADJTRAN.AJAISL AS AISLE, ADJTRAN.AJSLOT AS SLOT
FROM S216F06V.WDLSDATA.ADJTRAN ADJTRAN
WHERE (AJITEM=8011989 AND AJSTOR=581)
UNION
SELECT ILCATER.ILAISL AS AISLE, ILCATER.ILSLOT AS SLOT
FROM S216F06V.WDLSDATA.ILCATER ILCATER
WHERE (ILITEM=8011989 AND ILSTOR=581)

Любая помощь будет оценена по достоинству.

РЕДАКТИРОВАТЬ: AJAISL, AJSLOT, ILAISL и ILSLOT — это символьные поля длиной 4.


person rudefyet    schedule 02.09.2016    source источник
comment
В операции UNION у вас должно быть одинаковое количество столбцов и их типов данных. Пожалуйста, проверьте это с типами данных столбцов обеих таблиц, которые вы выбираете.   -  person Susang    schedule 02.09.2016
comment
Все выбранные столбцы имеют одинаковый тип данных. Отредактировал вопрос, чтобы указать это.   -  person rudefyet    schedule 02.09.2016
comment
Вы говорите, что все они CHAR(4). Можете ли вы показать нам (скопировать/вставить), где вы видите эти определения данных?   -  person user2338816    schedule 03.09.2016
comment
Являются ли ADJITEM, ADJSTOR, ILITEM, ILSTOR целочисленными полями?   -  person Parfait    schedule 03.09.2016
comment
Учитывая Основная причина, обнаруженная в этом вопросе о 802, похоже, что в вашей таблице, вероятно, неверные данные.   -  person Clockwork-Muse    schedule 03.09.2016
comment
Пожалуйста, выполните DSPFFD и вставьте определения всех столбцов в запросе, включая столбцы, используемые в предложении WHERE. Если окажется, что столбцы все соответствуют по типу, то в одной из таблиц могут быть ошибки десятичных данных. Разбейте UNION на части и посмотрите, работает ли каждый из них отдельно. Одно замечание: поиск с помощью «AS/400» вернет уродливую смесь старых (бесполезных) результатов и текущих. Попробуйте "IBM i" или "DB2 for i" только для текущих результатов.   -  person Buck Calabro    schedule 03.09.2016


Ответы (3)


Угадывание данных, найденных в выбранных столбцах, CAST() или CONVERT(), вероятно, поможет вам.

Попробуйте что-нибудь вроде —

SELECT CAST( ADJTRAN.AJAISL AS VARCHAR(128) ) AS AISLE, 
       CAST( ADJTRAN.AJSLOT AS VARCHAR(128) ) AS SLOT
...
UNION
SELECT CAST( ILCATER.ILAISL AS VARCHAR(128) ) AS AISLE, 
       CAST( ILCATER.ILSLOT AS VARCHAR(128) ) AS SLOT` 
...

ОТРЕДАКТИРОВАНО ДЛЯ ДОБАВЛЕНИЯ

Учитывая, что все выбранные столбцы имеют один и тот же тип данных, проблема, вероятно, в одном из проверенных столбцов.

Вы сравниваете то, что выглядит как INTEGER, со значениями в AJITEM, AJSTOR, ILITEM и ILSTOR, но какого типа эти столбцы, и все ли данные строго соответствуют этому типу?

Одна из стратегий устранения неполадок состоит в том, чтобы попробовать меньшие версии вашего запроса и постепенно добавлять элементы, пока вы не найдете триггер ошибки. Здесь я бы попробовал каждую часть UNION отдельно, по крайней мере, если бы не один элемент WHERE ... AND в нем.

person TallTed    schedule 02.09.2016
comment
Пробовал приводить как varchar(4) и приводить как char, возникает та же ошибка. Даже пытался объединить оба IE: CAST(AJAISL||'/'||AJSLOT AS VARCHAR(9)) - person rudefyet; 02.09.2016
comment
В этом СЛУЧАЕ не рекомендуется использовать преобразование или приведение, первое предпочтение - иметь одинаковые данные, это может быть проблема данных, не могли бы вы предоставить структуру данных и установить ее, чтобы мы могли выяснить проблему. - person Susang; 03.09.2016

Иногда в Excel бывают ошибки... Можете попробовать:

    select * from (
    SELECT ADJTRAN.AJAISL AS AISLE, ADJTRAN.AJSLOT AS SLOT
    FROM S216F06V.WDLSDATA.ADJTRAN ADJTRAN
    WHERE (AJITEM=8011989 AND AJSTOR=581)
    UNION
    SELECT ILCATER.ILAISL AS AISLE, ILCATER.ILSLOT AS SLOT
    FROM S216F06V.WDLSDATA.ILCATER ILCATER
    WHERE (ILITEM=8011989 AND ILSTOR=581)
    ) tmp
person Esperento57    schedule 04.09.2016

AJITEM и ILITEM — это VARCHAR(20). Я сравнивал его с INT. Исправлено, и приведенный ниже код работает без проблем. Моя вина в том, что я не указал это в исходном вопросе и не заметил такую ​​простую ошибку.

SELECT ADJTRAN.AJAISL AS AISLE, ADJTRAN.AJSLOT AS SLOT
FROM S216F06V.WDLSDATA.ADJTRAN ADJTRAN
WHERE (AJITEM='8011989' AND AJSTOR=581)
UNION
SELECT ILCATER.ILAISL AS AISLE, ILCATER.ILSLOT AS SLOT
FROM S216F06V.WDLSDATA.ILCATER ILCATER
WHERE (ILITEM='8011989' AND ILSTOR=581)
person rudefyet    schedule 13.09.2016