Почему UNION не работает в CTE или подзапросе? - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь выполнить запрос через System i Navigator, который выбирает из объединенного результата объединения.

Это прекрасно работает:

SELECT AF15VC FROM DB.AF
UNION
SELECT AF15VC FROM BATCH.AFM

Так почему это не работает?

WITH CTE AS (
    SELECT AF15VC FROM DB.AF
    UNION
    SELECT AF15VC FROM BATCH.AFM
)
SELECT *
FROM CTE

А почему это не работает?

SELECT *
FROM
    (SELECT AF15VC FROM DB.AF
     UNION
     SELECT AF15VC FROM BATCH.AFM
    ) AS AF

В обоих случаях я получаю эту ошибку:

Состояние SQL: 42601

Код поставщика: -199

Сообщение: [SQL0199]

Ключевое слово UNION неожиданно. Действительные токены:). Причина , , , , : Ключевое слово UNION здесь не ожидалось. Синтаксическая ошибка была обнаружена в ключевом слове UNION. Частичный список действительных токенов есть). Этот список предполагает, что утверждение верно вплоть до неожиданного ключевого слова. Ошибка может быть ранее в утверждении, но синтаксис утверждения, кажется, действителен до этого момента. Восстановление , , : Изучить оператор SQL в области указанного ключевого слова. Двоеточие или разделитель SQL могут быть отсутствует. SQL требует, чтобы зарезервированные слова были разделены, когда они используется в качестве имени. Исправьте оператор SQL и повторите запрос.

Я также пытался UNION ALL без изменений в результате.

Обновление:

Поскольку люди продолжают думать, что я не показываю реальные запросы, я добавил скриншоты. Вот первый запрос работает нормально, а второй два сбой:

query 1 query 2 query 3

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Ваши заявления должны работать нормально.Вот тест от моего IBM i на v7.2, но он должен работать так же на v7.1 или, по крайней мере, полностью до v5r3, основываясь на документации, которую я могу найти.

create table tablea
  (field1    Char(10),
   field2    Char(10));
create table tableb
  (field1    Char(10),
   field2    Char(10));
insert into tablea
  values ('row1', 'mama'),
         ('row2', 'papa');
insert into tableb
  values ('rowa', 'timmy'),
         ('rowb', 'sissy');

тогда

select * from tablea
union
select * from tableb;

дает:

FIELD1      FIELD2      
------------------------
row1        mama        
rowb        sissy       
row2        papa        
rowa        timmy       

и

with cte as (
  select * from tablea
  union
  select * from tableb)
select * from cte;

дает

FIELD1      FIELD2      
------------------------
rowb        sissy       
row1        mama        
row2        papa        
rowa        timmy       

и

select * 
from (
  select * from tablea
  union
  select * from tableb) a

т

FIELD1      FIELD2      
------------------------
rowb        sissy       
row1        mama        
row2        papa        
rowa        timmy       
0 голосов
/ 17 января 2019

Ну, по-видимому, система на самом деле версии 5.1, а не 7.1, как я сказал в комментарии.Я принял мою версию System i Navigator за версию ядра СУБД (или ОС, или что бы то ни было).Насколько я знаю, проблема в действительно старой версии.

0 голосов
/ 03 января 2019

Хорошо работает для меня при выпуске 7.2

with cte as (
select pmco#, pmmanf
from dtdata.pdpmast
union 
select pmco#, pmmanf
from devqdata.pdpmast
)
select * from cte;

Примечание: используйте UNION ALL, если у вас нет или не интересует дубликаты.UNION избавляет от дубликатов и, если нет никаких средств, много тратится впустую обработки.

...