LET句では、文内の他の箇所で使用されるが、文の結果に必ずしも出現しない属性を定義します。
LETの主な用途は、計算した属性の値によるグルーピング(特に、計算した属性のMEMBERSによるグルーピング)を容易にすることです。ただし、LETは、グルーピングであってもなくても任意の文で使用し、文内の他の場所で使用される一時的な値を定義できます。
LET <expression> [AS <attribute>][, <expression> [AS <attribute>]]*
RETURN Results AS LET x + y AS intermediateSum SELECT MIN(x) AS min_x, intermediateSum + z AS finalSum FROM WineState GROUP BY finalSumResults文の出力には、min_xおよびfinalSumの2つの属性のみが含まれます。LETにバインドされた属性intermediateSumは出力に含まれません。
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属性がグルーピング・キーとして使用される場合、文の結果にも含まれ、ORDER BYおよびHAVING句で使用できます。属性がグルーピング・キーではない場合、ORDER BYまたはHAVINGのスコープ内にはありません。
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句で使用できません。