7.25.2 ORDER BY句にソート指定リストを指定した場合の規則
- 〈この項の構成〉
(1) 共通の規則
-
ソートキーには,値式とソート項目指定番号の両方を混在して指定できます。
(例)
SELECT "C1", AVG("C2") FROM "T1" GROUP BY "C1" ORDER BY "C1" ASC, 2 ASC
-
ソートキーを重複して指定した場合,先に指定した順序付け指定,およびナル値ソート順指定が優先されます。
(例)
SELECT "C1","C2" FROM "T1" ORDER BY "C1" ASC NULLS FIRST,"C1" DESC NULLS LAST
上記の場合,先に指定した下線部分の指定が優先されます。
-
選択リストに同じ列を2つ以上指定した場合,その列をソートキーに指定できません。エラーになるSQL文の例を次に示します。
(例)エラーになるSQL文の例
SELECT "C1","C2","C1" FROM "T1" ORDER BY "C1"
-
ORDER BY句に指定した導出列名が単一の列指定だけから導出されている場合,その列指定によって置き換えられます。例えば,次に示す3つのSQL文は同じ検索結果になります。
SELECT "T1"."C1" DR1,"T1"."C2" DR2 FROM "T1" ORDER BY DR1 SELECT "T1"."C1" DR1,"T1"."C2" DR2 FROM "T1" ORDER BY "T1"."C1" SELECT "T1"."C1" DR1,"T1"."C2" DR2 FROM "T1" ORDER BY 1
(2) ソートキーに値式を指定した場合の規則
-
ソートキーに?パラメタを単独で指定できません。
-
ソートキーに値式(列指定だけの値式を除く)を指定した場合,導出列名(単純な列指定から成る導出列を除く)をソートキーに指定することはできません。
■エラーになるSQL文の例
SELECT "C1",SUM("C2") AS "SUMC2" FROM "T1" GROUP BY "C1" ORDER BY "SUMC2"+1
また,集合演算を指定した場合,集合演算によって導出される導出列名をソートキーに指定することはできません(単純な列指定から成る導出列であっても指定できません)。
■エラーになるSQL文の例
SELECT "C1","C2" FROM "T1" UNION ALL SELECT "C1"+"C2","C3" FROM "T1" ORDER BY "C1"+"C2"
-
集合演算を指定した問合せ式本体を対象とするソートキーに値式を指定する場合,同じ値式を集合演算の先頭の集合演算項である問合せ指定の選択式に指定する必要があります。
■正しいSQL文の例
(例1)
SELECT "C1"+"C2","C3" FROM "T1" UNION SELECT "C1","C2" FROM "T2" ORDER BY "C1"+"C2" SELECT "C1"+"C2","C2" FROM "T1" UNION SELECT "C1","C2" FROM "T2" ORDER BY "C2"
上記の例の場合,集合演算の先頭の集合演算項である問合せ指定の選択式に,ソートキーで指定した値式と同じ値式が指定されているため,SELECT文を実行できます。
(例2)
SELECT "C1"+"C2" AS "C1","C2" FROM "T1" UNION SELECT "C1","C2" FROM "T2" ORDER BY "C1"
上記の例のようにソートキーに指定した値式が列指定の場合は,AS句を指定することでSELECT文を実行できます。
■エラーになるSQL文の例
SELECT "C1","C2" FROM "T1" UNION SELECT "C1"+"C2","C2" FROM "T2" ORDER BY "C1"+"C2"
上記の例の場合,集合演算の先頭の集合演算項である問合せ指定の選択式に,ソートキーで指定した値式と同じ値式が指定されていないため,エラーになります。
-
DISTINCT指定ありの問合せ指定を対象とするソートキーに値式を指定する場合,同じ値式を選択式に指定する必要があります。
■正しいSQL文の例
(例1)
SELECT DISTINCT "C1"+"C2","C2" FROM "T1" ORDER BY "C1"+"C2" SELECT DISTINCT "C1"+"C2","C2" FROM "T1" ORDER BY "C2"
上記の例の場合,ソートキーで指定した値式と同じ値式が選択式に指定されているため,SELECT文を実行できます。
(例2)
SELECT DISTINCT "C1"+"C2" AS "C1","C2" FROM "T1" ORDER BY "C1"
上記の例のようにソートキーに指定した値式が列指定の場合は,AS句を指定することでSELECT文を実行できます。
■エラーになるSQL文の例
SELECT DISTINCT "C1","C2" FROM "T1" ORDER BY "C1"+"C2"
上記の例の場合,ソートキーで指定した値式と同じ値式が選択式に指定されていないため,エラーになります。
-
ソートキーにウィンドウ関数を指定する場合,ソートキーに指定した値式と同じ値式を選択式に指定する必要があります。
■正しいSQL文の例
SELECT SUM("C1") OVER()/100 FROM "T1" ORDER BY SUM("C1") OVER()/100
上記の例の場合,ソートキーに指定した値式が選択式にも指定されているため,SQL文を実行できます。
■エラーになるSQL文の例
SELECT SUM("C1") OVER() FROM "T1" ORDER BY SUM("C1") OVER()/100
上記の例の場合,ソートキーで指定した値式と同じ値式が選択式に指定されていないため,エラーになります。
-
次に示す場合は,ソートキーの値式に副問合せまたは?パラメタを指定できません。
-
集合演算を指定している場合
-
DISTINCT指定ありの問合せ指定の場合
■エラーになるSQL文の例
SELECT "C1"+?,"C2" FROM "T1" UNION SELECT "C1","C2" FROM "T2" ORDER BY "C1"+?
-
-
ORDER BY句中の副問合せから,ORDER BY句の対象となる問合せ指定の表参照の表は参照できません。
■エラーになるSQL文の例
SELECT * FROM "T1" ORDER BY "C1",(SELECT "C1" FROM "T2" WHERE "C2"="T1"."C2")+"C2"
-
ソートキーに集合関数を指定した場合,次のどちらかの条件を満たす必要があります。
(1)集合関数の修飾問合せに指定している選択式にグループ化列を指定する
(2)ソートキーに指定した値式に含まれる列指定を,グループ化列か,または被集約引数に指定する
■正しいSQL文の例
SELECT "C1" FROM "T1" GROUP BY "C1" ORDER BY AVG("C2")
上記の例は,(1)の条件を満たしています。
SELECT "C2" FROM "T1" GROUP BY "C1","C2" ORDER BY SUM("C1"),"C2"
上記の例は,(2)の条件を満たしています。
■エラーになるSQL文の例
SELECT "C1" FROM "T1" ORDER BY AVG("C2")
-
ソートキーと選択式に同じ値式を指定した場合,選択式に指定した値式を使ってソート処理が行われます。ソートキーに指定した値式はソート処理で使われません。
(例)
SELECT "C1","C2" FROM "T1" ORDER BY "C1" SELECT "C1"+"C2","C2" FROM "T1" ORDER BY "C1"+"C2"
上記の例の場合,選択式に指定した値式を使ってソート処理が行われます。
-
ソートキーと選択式に異なる値式を指定した場合,ソートキーに指定した値式を使ってソート処理が行われます。ただし,このとき,ソートキーに指定した値式を選択式に内部的に追加し,ソート処理が行われます。
(例)
SELECT "C1" FROM "T1" ORDER BY "C2"
上記の例の場合,C2列の値でソート処理が行われて,C1列の値がソート順に返されます。このとき,ソートキーに指定した値式(C2)を選択式に内部的に追加し,ソート処理が行われます。そのため,問合せ指定中で制限されている値式の規則は,内部的に追加したソートキーの値式にも適用されます。
■エラーになるSQL文の例
SELECT MEDIAN("C1"*0.5) FROM "T1" ORDER BY PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY "C1"*0.5)
上記の例の場合,下線部分のソートキーは選択式に内部的に追加されますが,逆分布関数の制限(被集約引数に単独の列指定ではない値式を指定した逆分布関数を,同一問合せ指定中に複数指定できない)によってエラーとなります。