簡體   English   中英

SQL在Union語句中使用Order By

[英]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.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

您可以使用order byorder 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM