2016-03-20 5 views
1

Oracle SQL Dbを使用しており、辞書でX文字で始まる用語の数を数えようとしています。ここで書き換えずにselect句の一部を使用する

は私のクエリです:

SELECT Substr(Lower(Dict.Term),0,1) AS Initialchar, 
     Count(Lower(Dict.Term)) 
FROM Dict 
GROUP BY Substr(Lower(Dict.Term),0,1) 
ORDER BY Substr(Lower(Dict.Term),0,1); 

このクエリは、期待通りに働いているが、私はについては本当に満足していない事は、私は長い間「SUBSTR(下段(Dictのを書き換えるために持っているという事実であります.Term)、0,1) "をGROUP BY句とORDER BY句に指定します。 SELECT部分​​で定義したものを再利用する方法はありますか?

ありがとうございました

答えて

2

サブクエリを使用できます。 OracleはSQL標準に準拠しているため、substr()は1でカウントを開始します.Oracleは明示的に0("If position is 0, then it is treated as 1")を許可していますが、「0」と「1」が同じ位置を参照するため誤解を招きます。だから、

:直接

select first_letter, count(*) 
from (select d.*, substr(lower(d.term), 1, 1) as first_letter 
     from dict d 
    ) d 
group by first_letter 
order by first_letter; 
+0

これは完全に機能しました。ありがとうございました! – Skynti

0

ありません。出力列はORDER BY句でのみ参照できますが、他の方法では使用されません。唯一の方法は、それを副選択にすることですが、それは明確ではなく、パフォーマンスに関して問題を引き起こす可能性があります。

+0

order by句の 'initialChar'エイリアスを参照できます。しかしそれは問題の半分に過ぎず、group by節でそれを参照することはできないので、実際には役に立ちません。 –

+0

@AlexPooleありがとう、編集済み –

0

私はこの目的のためにsubquery factoringを好む。

with init as (
select substr(lower(d.term), 1, 1) as Initialchar 
from dict d) 
select Initialchar, count(*) 
from init 
group by Initialchar 
order by Initialchar; 

逆の意味とは対照的に、IMOはクエリをはるかに明確にし、自然順序を定義します。特により多くのサブクエリを使用しています。

私はパフォーマンス上の注意点を認識していませんが、別のwith句の中にwith句を使用できないなど、いくつかの制限があります。ORA-32034: unsupported use of WITH clause

関連する問題