Oracle 11g。 WASHINGTON DC不在我的STATES表中,我没有权限添加它,但它需要在结果集中。我还希望DC在排序顺序中首先出现。
STATES
STATE_ID STATE_DESC
----------------------
FL FLORIDA
HI HAWAII
WY WYOMING
-----------------------------------------
select 'DC' state_id, 'WASHINGTON DC' state_desc from dual
union
select state_id, state_desc from states
order by
case state_id
when 'DC' then 'AAAA'
else state_desc
-------------------------
以上查询会产生以下错误消息:
ORA-01785: ORDER BY item must be the number of a SELECT-list expression
STATE_ID STATE_DESC
DC WASHINGTON DC
FL FLORIDA
HI HAWAII
WY WYOMING
答案 0 :(得分:2)
您似乎只需要外部SELECT
即可应用ORDER BY
。像
SQL> ed
Wrote file afiedt.buf
1 with states as (
2 select 'FL' state_id, 'Florida' state_desc from dual union all
3 select 'HI', 'Hawaii' from dual union all
4 select 'WY', 'Wyoming' from dual
5 )
6 select state_id, state_desc
7 from (select 'DC' state_id, 'Washington D.C.' state_desc
8 from dual
9 union all
10 select state_id, state_desc
11 from states)
12 order by (case when state_id = 'DC'
13 then 'AAA'
14 else state_desc
15* end)
SQL> /
ST STATE_DESC
-- ---------------
DC Washington D.C.
FL Florida
HI Hawaii
WY Wyoming
虽然它可能并不重要,因为您的STATES
表可能只有50行,但执行UNION ALL
而不是UNION
通常会更有效率,因为它不要求Oracle检查并消除重复的行。
答案 1 :(得分:0)
我没有Oracle检查优化器但是我倾向于采用这样的方法
SELECT State_ID, State_Desc
FROM ( SELECT 1 AS SortOrder, State_ID, State_Desc
FROM States
UNION ALL
SELECT 0, 'DC', 'WASHINGTON DC'
FROM Dual
)
ORDER BY SortOrder, State_ID
更改排序顺序,而不是使用case语句。在SQL-Server-2008中使用SortOrder
列肯定更有效。