[英]SQL Using Order By in Union Statement
請查看下面我正在努力的代碼:
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 ORDER BY子句中不允許使用合格的列名。 任何給出錯誤的建議解決方案
謝謝
將order by子句放在外面,並為內部選擇列表中的所有列加上別名。
( 內部最好使用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
您可以使用order by
的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
表具有相同的列,並且它們的類型以相同的順序定義。 更好的做法是列出所有列。
如果使用的是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
例如,這些表
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必須對所有行進行排序以刪除重復項
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.