[英]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.operation
或oper.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 by
的order 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.