SQL с помощью Order By в операторе объединения - PullRequest
0 голосов
/ 26 мая 2018

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

select * 
from AAA_PROD_XEUSS.P_E_LVR_CQT CQT 
left join AAA_PROD_XEUSS.P_F_OPERATION OPER
on CQT.OPERATION = OPER.OPERATION
union
select * 
from BBB_PROD_XEUSS.P_E_LVR_CQT CQT
left join BBB_PROD_XEUSS.P_F_OPERATION OPER
on CQT.OPERATION = OPER.OPERATION
where CQT.PROCESS = '1111'
Order by OPERATION

Я получаю следующее сообщение об ошибке: ОШИБКА [42877] [IBM] [DB2 / LINUXX8664] SQL0197N Полное имя столбца не разрешено в ЗАКАЗЕПункт BY.Любое предлагаемое решение с ошибками

Спасибо

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Вы можете использовать order by, но вам нужно явно перечислить столбцы.В любом случае, это хорошая практика:

select cqt.*, oper.?, oper.?, . . .
from AAA_PROD_XEUSS.P_E_LVR_CQT CQT left join
     AAA_PROD_XEUSS.P_F_OPERATION OPER
    on CQT.OPERATION = OPER.OPERATION
union
select cqt.*, oper.?, oper.?, . . .
from BBB_PROD_XEUSS.P_E_LVR_CQT CQT left join
     BBB_PROD_XEUSS.P_F_OPERATION OPER
     on CQT.OPERATION = OPER.OPERATION
where CQT.PROCESS = '1111'
Order by OPERATION;

Столбец OPERATION должен исходить из таблицы CQT.? s являются заполнителями для дополнительных столбцов в OPER.Это предполагает, что две таблицы CQT имеют одинаковые столбцы с одинаковыми типами, определенными в одинаковом порядке.Лучше всего перечислить все столбцы.

0 голосов
/ 29 мая 2018

Если вы используете Db2 11.1, вы можете использовать синтаксис JOIN USING, чтобы избежать двух копий объединенных столбцов в наборе результатов https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0059207.html

Например, с этими таблицами

create table AAA_PROD_XEUSS.P_E_LVR_CQT   (i int, OPERATION int, PROCESS char(4)););
create table AAA_PROD_XEUSS.P_F_OPERATION (b int, OPERATION int);
create table BBB_PROD_XEUSS.P_E_LVR_CQT   (c int, OPERATION int, PROCESS char(4));
create table BBB_PROD_XEUSS.P_F_OPERATION (b int, OPERATION int);

этот выбор

select * 
from AAA_PROD_XEUSS.P_E_LVR_CQT CQT 
left join AAA_PROD_XEUSS.P_F_OPERATION OPER
USING ( OPERATION )
union
select * 
from BBB_PROD_XEUSS.P_E_LVR_CQT CQT
left join BBB_PROD_XEUSS.P_F_OPERATION OPER
USING ( OPERATION )
where CQT.PROCESS = '1111'
Order by OPERATION

Возвращает только один столбец с именем OPERATION

OPERATION I PROCESS B
--------- - ------- -

0 record(s) selected.

PS. Вы можете предпочесть использовать UNION ALL вместо UNION, чтобы избежатьDb2 приходится сортировать все строки, чтобы удалить дубликаты

0 голосов
/ 26 мая 2018

Возьмите заказ по предложению снаружи и добавьте псевдонимы ко всем столбцам в списках выбора внутренней части.

( Один из cqt.operation или oper.operation может быть предпочтительным внутри, так как они 'соответствует 100 * *):

Select * 
from
    (select cqt.col1, cqt.col2, oper.* 
     -- where "operation" column is exempted from cqt list, 
     --  since the table aliased as oper already has "operation" column.
     from AAA_PROD_XEUSS.P_E_LVR_CQT CQT 
     left join AAA_PROD_XEUSS.P_F_OPERATION OPER on CQT.OPERATION = OPER.OPERATION
     union
     select cqt.col1, cqt.col2, oper.*
     from BBB_PROD_XEUSS.P_E_LVR_CQT CQT
     left join BBB_PROD_XEUSS.P_F_OPERATION OPER on CQT.OPERATION = OPER.OPERATION
     where CQT.PROCESS = '1111'
) 
Order by OPERATION
...