SQL苦手だなぁ、と思い、勉強し始めたところ、「SELECT句でAlias書いたのに、WHERE句で使えない。どの順番で実行されているんだっけ?」となったため、調べてみました。(SQL Server)
SELECT句の論理処理の順番
Microsoft公式, Logical processing order of the SELECT statement
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- WITH CUBE or WITH ROLLUP
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- TOP
SELECT句は8番目のため、8番目以降の句でSELECT句で指定されたAliasが使用できます。
但し、query processorが実際の処理順を決めており、その処理順は上記の論理処理の順番と異なる可能性がある、とのことでした。
SELECT
CONCAT_WS(' ', FirstName, LastName) AS Name
FROM Person.Person
ORDER BY Name;では、論理処理順がSELECT句の前でAliasを使いたい場合はどうするかというと
SELECT
CONCAT_WS(' ', FirstName, LastName) AS Name
FROM Person.Person
WHERE
LEN(CONCAT_WS(' ', FirstName, LastName)) >= 10
ORDER BY Name;使いたい句内で同様の計算をしてあげる方法や
SELECT
*
FROM (
SELECT CONCAT_WS(' ', FirstName, LastName) AS Name
FROM Person.Person
) AS t
WHERE
LEN(Name) >= 10
ORDER BY Name;Subqueryで目的に沿ったデータセットを作り、参照する方法があります。
以上、基本のキではありますが、句の実行順とちょっとしたテクニックの紹介でした。
コメント