0

オラクル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
4

2 に答える 2

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行しかないため、それほど重要ではありませんが、Oracleが重複行をチェックして削除する必要がないため、一般的にはより効率的ですUNION ALLUNION

于 2012-04-25T15:11:45.663 に答える
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方が確実に効率的です。

于 2012-04-25T15:49:26.117 に答える