У меня возникли проблемы с корректной работой моего запроса Vertica. Давайте предположим, что у меня есть отношение, которое определяется следующим образом:
CREATE TABLE KOMM (
MANDT VARCHAR(3),
DOCNUM VARCHAR(16),
COUNTER VARCHAR(3),
NUM VARCHAR(6),
NAM VARCHAR(30),
INNUM VARCHAR(6),
KOMMLEVEL VARCHAR(2),
MSG VARCHAR(1000),
NUM_UNH VARCHAR(6)
);
и вставляем несколько примеров значений:
insert into KOMM values ('200','45320824','000','000003','START','000002','02','START OF MESSAGE');
insert into KOMM values ('200','45320824','000','000004','INTERMED','000003','03','EXAMPLEEXAMPLEEXAMPLE');
insert into KOMM values ('200','45320824','000','000005','ADV_01','000003','03','TESTADV1');
insert into KOMM values ('200','45320824','000','000011','END','000010','04','01234567');
...
insert into KOMM values ('200','45320824','000','000022','START','000002','02','CONTINUE START OF MESSAGE');
insert into KOMM values ('200','45320824','000','000023','INTERMED','000003','03','SECONDEXAMPLEEXAMPLEEXAMPLE');
insert into KOMM values ('200','45320824','000','000024','ADV_01','000003','03','SECONDTESTADV1');
insert into KOMM values ('200','45320824','000','000030','END','000010','04','01234567');
Теперь я хотел бы запросить отношение с помощью следующего запроса:
UPDATE KOMM E
SET NUM_UNH = (SELECT MAX(X.NUM)
FROM KOMM X
WHERE X.NAM IN ('START')
AND X.MANDT = E.MANDT
AND X.DOCNUM = E.DOCNUM
AND X.NUM <= E.NUM
)
FROM KOMM X
WHERE E.MANDT = X.MANDT AND E.DOCNUM = X.DOCNUM
;
Однако в этом запросе выдается следующая ошибка:
Ошибка выполнения: [Vertica] VJDBC ОШИБКА: выражение подзапроса, не связанное с равенством, не поддерживается
Я думаю, это потому, что Vertica не допускает сравнения <=,> =, <и> внутри подзапросов? См. Документацию Vertica для ограничений подзапроса.
Поэтому я попытался решить ее с помощью МЕЖДУ :
UPDATE KOMM E
SET NUM_UNH = (SELECT max(X.NUM)
FROM KOMM X
WHERE X.NAM IN ('START')
AND X.MANDT = E.MANDT
AND X.DOCNUM = E.DOCNUM
AND X.NUM BETWEEN '000000' AND (E.NUM)
)
from KOMM X
where E.MANDT = X.MANDT and E.DOCNUM = X.DOCNUM
;
Это приводит к той же ошибке:
Ошибка выполнения: [Vertica] VJDBC ОШИБКА: выражение подзапроса, не связанное с неравенством, не поддерживается
Поэтому я попытался проигнорировать условие и столкнулся с другой проблемой после выполненияследующий запрос:
UPDATE KOMM E
SET NUM_UNH = (SELECT max(X.NUM)
FROM KOMM X
WHERE X.NAM IN ('START')
AND X.MANDT = E.MANDT
AND X.DOCNUM = E.DOCNUM
)
from KOMM X
where E.MANDT = X.MANDT and E.DOCNUM = X.DOCNUM
;
В результате возникла следующая ошибка:
Ошибка выполнения: [Vertica] VJDBC ОШИБКА: самостоятельные объединения в выражениях UPDATE недопустимы [Vertica] [VJDBC] Подробности: целевое отношение "da592a51-45ee-4d3e-9983-e8a3e56fd852_2fd1ec98-bb71-4ad0-8d33-d751e209dcdd". KOMM также появляется в списке FROM
Я нашел эту "работу"выдайте, заменив "из KOMM X" на "из (выберите * из KOMM) X" . Этот запрос выполняется, но не так, как хотелось бы (как вы можете себе представить). Цель состоит в том, чтобы обновить таблицу со значением NUM, пока в таблице не появится следующее более высокое значение NUM, так что таблица может быть окончательно агрегирована только путем отображения строк, в которых NAM имеет значение «START»:
SELECT
M.MANDT, M.DOCNUM, M.NUM_UNH,
max(case
when M.NAM = 'START' then substring(cast(M.MSG as varchar(99)),15,6)
end) as UNH_SEG,
max(case
when M.NAM = 'END'
then substring(cast(M.MSG as varchar(36)),4,33)
end) as PMSG
from KOMM M
group by M.MANDT, M.DOCNUM, NUM_UNH
;
Первая строка результата Вторая строка результата
К сожалению, я не могу найти решение этих проблем, поэтому я надеюсь, что выребята могут помочь мне. Заранее благодарю за помощь и предложения!
С наилучшими пожеланиями, MoDo