如何将不在表中的行包含在结果集中?

时间:2012-04-25 15:02:19

标签: sql sorting oracle11g

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

2 个答案:

答案 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列肯定更有效。