简体   繁体   English

SQL在Union语句中使用Order By

[英]SQL Using Order By in Union Statement

Please see below code i am struggling with: 请查看下面我正在努力的代码:

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

I am getting following Error: ERROR [42877] [IBM][DB2/LINUXX8664] SQL0197N A qualified column name is not allowed in the ORDER BY clause. 我遇到以下错误:错误[42877] [IBM] [DB2 / LINUXX8664] SQL0197N ORDER BY子句中不允许使用合格的列名。 Any suggested solution giving errors 任何给出错误的建议解决方案

Thank you 谢谢

Take the order by clause outside, and alias all the columns in the select lists of inner part. 将order by子句放在外面,并为内部选择列表中的所有列加上别名。

( One of cqt.operation or oper.operation may be preferred inside, since they're matched to be equal ) : 内部最好使用cqt.operationoper.operation ,因为它们匹配相等 ):

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

You can use the order by , but you need to list the columns explicitly. 您可以使用order byorder by ,但需要显式列出各列。 This is a good practice anyway: 无论如何,这是一个好习惯:

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;

The OPERATION column should be coming from the CQT table. OPERATION列应来自CQT表。 The ? ? s are placeholders for additional columns in OPER . s是OPER其他列的占位符。 This assumes that the two CQT tables have the same columns with the same types defined in the same order. 假定两个CQT表具有相同的列,并且它们的类型以相同的顺序定义。 The better practice is to list all columns. 更好的做法是列出所有列。

If you are using Db2 11.1, you can use the JOIN USING syntax to avoid having two copies of the joined column(s) in the result set https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0059207.html 如果使用的是Db2 11.1,则可以使用JOIN USING语法来避免在结果集中有两个连接列的副本https://www.ibm.com/support/knowledgecenter/zh-CN/SSEPGG_11.1.0/ com.ibm.db2.luw.sql.ref.doc / doc / r0059207.html

Eg with these tables 例如,这些表

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);

this select 这个选择

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

Will return just one column named OPERATION 将仅返回一个名为OPERATION的列

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

0 record(s) selected.

PS You might prefer to use UNION ALL rather than just UNION to avoid Db2 having to sort all the rows to remove duplicates PS您可能更喜欢使用UNION ALL而不是UNION以避免Db2必须对所有行进行排序以删除重复项

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM