LET
句では、文の他の場所で使用される可能性があるが、必ずしも文の結果に出現する必要がない属性が定義されます。
LET
の主な目的は、計算対象属性の値でのグループ化(および特に計算対象属性のMEMBERS
によるグループ化)を容易にすることです。 ただし、LET
は文の中で使用できる一時的な値を定義するために、グループ化されているものもそうでないものもあります。
LET <expression> [AS <attribute>][, <expression> [AS <attribute>]]*
LET
は、次の例のように、SELECT
句の直前の文に記述できます:
RETURN Results AS LET x + y AS intermediateSum SELECT MIN(x) AS min_x, intermediateSum + z AS finalSum FROM WineState GROUP BY finalSum「結果」文の出力には、min_xとfinalSumの2つの属性のみが含まれています。
LET
バウンドの属性intermediateSumは出力に表示されません。
LET
はSELECT
句の直前(前述の例を参照)に配置され、その後に1つ以上の属性定義をカンマで区切って指定する必要があります。 これらの属性定義は、SELECT
の後に表示される定義とまったく同じように機能します。 特に、定義の左側の式がbare属性参照(オプションでdata-source修飾子)である場合、定義のAS
句はオプションです。 つまり、次のように記述できます:
LET x, State.y AS y, 3 as z
LET x AS x, State.y AS y, 3 as z
LET
属性は、文のWHERE
句(使用する場合)の直後、およびSELECT
属性のいずれかが計算される前に即座に計算されます。
グループ化の前にLET
属性が計算されるため、AVG
やSUM
のようなアグリゲータはLET
の句では無効になり、EQLはそのコンテキストにエラーがある場合にシグナルします。
LET範囲指定
LET
で定義される属性は、次のようにスコープ内にあります:
LET
定義
SELECT
定義が対象
MEMBERS
を含むGROUP BY
句は、同じ文で記述します。
また、LET
属性がグループ化キーとして使用されている場合は、文の結果にも表示され、ORDER BY
およびHAVING
句で使用できます。 属性がグループ化キーでない場合は、ORDER BY
またはHAVING
のスコープ内ではありません。
LET
スコープ指定のルールを示しています:
RETURN results AS LET (FOREACH d IN orderDates RETURN (EXTRACT(d, YEAR))) AS orderYears SELECT MAX(totalCost) AS maxCost FROM OrderHistory GROUP BY orderYears HAVING 2014 IN orderYears
この例では、データソースOrderHistoryでmdex:dateTime-set
タイプの属性orderDatesが定義されているものとします。 orderYears属性の定義により、orderDatesの各日付から年が抽出され、これらの年がセットに再割当されます。 この文では、受注年のセットで結果をグループ化し、それぞれの最大原価を計算し、orderDatesで2014年の少なくとも1日を持つオーダーに対する行を返します。 orderYearsはグループ・キーであるため、出力表には2つの属性(maxCostおよびorderYears)、orderYearsはHAVING
句で使用できます。
RETURN results AS LET (FOREACH d IN orderDates RETURN (EXTRACT(d, YEAR))) AS orderYears SELECT MAX(totalCost) AS maxCost FROM OrderHistory GROUP BY MEMBERS(orderYears) AS yr
この文は前の例と同じですが、orderYearsではなくメンバーによってグループ化される点が異なります。 したがって、orderYearsはグループ・キーではなく、グループ・キーyrのコンピュートにのみ使用されます。 したがって、orderYearsは文の出力には表示されず、HAVING
またはORDER BY
のいずれの句にも表示できません。 (文の出力には、yrとmaxCostという2つの属性が含まれています。)
前述のルールを要約: 非グループ化文では、LET
属性は出力に表示されず、HAVING
およびORDER BY
句に表示されることもありません。