2つの列をチェーンするクエリがあります。エイリアスnotがGROUP BY
句で機能するのに、ORDER BY
句では機能するのはなぜですか?選択を正しく書くにはどうすればよいですか?
SELECT
KOS_VER_ID AS "Vertrag"
, WHR_ISO_3_CODE AS "Waehrung"
, KOS_KOA_ST_KZN || ' - ' || ST_LANGBEZ_EN as "Kostenart"
, SUM (KOS_BETRAG) AS "Summe pro KOA"
FROM
KOSTEN
, WAEHRUNG
, SCHLUESSELTABELLE
WHERE
KOSTEN.KOS_VERHI_WHR_ID = WAEHRUNG.WHR_ISO_ID
AND KOSTEN.KOS_KOA_ST_KZN = SCHLUESSELTABELLE.ST_ID
AND KOS_VER_ID in (2509, 2510, 2511)
GROUP BY
KOS_VER_ID
, WHR_ISO_3_CODE
, KOS_KOA_ST_KZN || ' - ' || ST_LANGBEZ_EN
ORDER BY
"Vertrag"
, "Kostenart"
;
エイリアスがGROUP BY句で機能しないのはなぜですか?
これらは単に構文規則だからです。列のエイリアスはORDER BY
句で使用できますが、GROUP BY
句では使用できません。
構文図を見ると、これが明らかになります。
したがって、ORDER BY
の後に式が許可された後、位置(order by 1
)またはc_alias
は「列のエイリアス」を表します。
ご覧のように、その後にc_alias
オプションがないため、列のエイリアスを使用できません。
これはOracleにとって特別なことではありません。これは、SQL標準での定義方法です。
@a_horse_with_no_nameで言及されている構文の制限は、SQLデータベースエンジンによってクエリが論理的に処理される方法を単に反映したものです。
FROM
句が処理され、必要なすべてのテーブルが識別されます。WHERE
句が処理され、述語がテーブルの行に適用されます。GROUP BY
句が処理され、WHERE
の後に残っている行に集計関数が適用されます。HAVING
句が処理され、GROUP BY
の出力に追加の述語が適用されます。SELECT
リストが処理され、要求された列が取得され、場合によってはエイリアスが割り当てられます。ORDER BY
句が処理され、SELECT
リスト処理の後であるため、割り当てられたエイリアスにアクセスできます。コード評価は、SELECTステートメントの論理処理順序に従います。
エイリアスは、前のステップで導入された場合にのみ使用できます。そのため、SELECT
句のエイリアスはORDER BYで使用できますが、GROUP BY
句では使用できません。
リファレンス: Microsoft T-SQL Documentation 詳細については、.
お役に立てれば。
また、 関連する議論