論理参照表および論理参照列の作成
この項では、論理参照表および論理参照列の作成について説明します。
論理参照表の作成
ビジネス・モデルで論理参照表オブジェクトを作成して、翻訳参照表に必要なメタデータを定義します。
論理表の参照表としての指定で説明しているように、参照表とは、自身を参照表として指定するプロパティを持つ論理表のことです。次の図は、参照表の例を示しています。
Product_Translation表
Product_Code | Language_Key | 説明 |
---|---|---|
A123 | DE | Brot |
A123 | IT | Pane |
B234 | DE | Marmelade |
B234 | IT | Marmelde di agrumi |
C345 | DE | Milch |
C345 | IT | Latte |
-
参照表の各主キーをまとめて参照キーと見なし、参照が実行されます。参照は、すべての参照キー列に値が指定されている場合にのみ実行できます。たとえば、前述の図では、Product_CodeとLanguage_Keyの組合せによってこの参照表の主キーが形成されます。
-
参照キーは論理表キーとは異なります。参照キー列ではその順序が考慮されます。たとえば、Product_CodeとLanguage_Keyの参照キーは、Language_KeyとProduct_Codeの参照キーとは異なると見なされます。参照キーのすべての列は参照関数で結合する必要があります。
-
参照表には、参照キーの組合せがあります。
-
参照表には少なくとも1つの値列が含まれます。前述の図ではDescriptionが値列であり、製品の説明の翻訳済値が含まれています。
-
参照キーから各値列への関数従属性が存在する必要があります。つまり、参照キーによって値列を識別できます。参照キーおよび値列は、どちらも同じ物理表に属している必要があります。
-
参照表は独立しており、他の論理表には結合されません。
整合性チェック・ルールは参照表に対しては緩和されるため、表が参照表として指定されている場合、サブジェクト領域内の他の表と結合する必要はありません(論理表は、通常、サブジェクト領域内の1つ以上の表に結合されます)。
-
参照列を使用した集計の結果は、ベース列を使用した結果と一致する必要があります。たとえば、次のコードを実行したとします
SELECT productname_trans.productname, sales.revenue FROM snowflakesales;
これは、次のコードと同じ結果を戻す必要があります。
SELECT product.productname, sales.revenue FROM snowflakesales;
この例の参照表productname_transで参照キーProductIDおよびLANGUAGEを使用している場合、両方の問合せで同じ集計結果が戻されます。
参照キーにproductnameとは異なる集計レベルの列が含まれる場合は、問合せで変更が取得され、集計に反映されます。
論理表の参照表としての指定
論理表を参照表として使用するには、事前に、(セマンティック・モデラーを使用して)論理表を参照表として指定する必要があります。
論理表を参照表として指定するには、最初に参照表を物理レイヤーにインポートし、それを論理レイヤーにドラッグ・アンド・ドロップします。
参照表の主キーに指定されている列の順番により、LOOKUP
関数の対応する引数の順番が決まります。
たとえば、参照表の主キーがRegionKey列、CityKey列およびLanguageKey列で構成される場合、LOOKUP
関数の対応する引数を同じ順番で指定する必要があります。主キー列の順序を変更するには、セマンティック・モデラーを使用します。
LOOKUP関数の構文について
LOOKUP
関数は通常、論理レイヤーで、翻訳済の論理表列の式として使用されます。
LOOKUP
関数の構文は、次のようになります。
Lookup ::= LookUp([DENSE] value_column, expression_list ) | LookUp(SPARSE value_
column, base_column, expression_list )
expression_list ::= expr {, expression_list }
expr ::= logical_column | session_variable | literal
たとえば:
LOOKUP( SPARSE SnowflakeSales.ProductName_TRANS.ProductName, SnowflakeSales.Product.ProductName, SnowflakeSales.Product.ProductID, VALUEOF(NQ_SESSION."LANGUAGE"))
LOOKUP( DENSE SnowflakeSales.ProductName_TRANS.ProductName, SnowflakeSales.Product.ProductID, VALUEOF(NQ_SESSION."LANGUAGE"))
次のことに注意してください:
-
LOOKUP
関数は密または疎のいずれかで、キーワードDENSE
またはSPARSE
を使用して指定します。DENSE
とSPARSE
をどちらも指定しない場合、デフォルト動作は密参照になります。DENSE
参照の場合、翻訳表は内部結合を通じてベース表に結合されますが、SPARSE
参照の場合は左外部結合が実行されます。 -
第1パラメータ(
DENSE
またはSPARSE
キーワードの後のパラメータ)は、論理レイヤーで定義されている有効な参照表の有効な値列にする必要があります。 -
SPARSE
キーワードを指定した場合、第2パラメータは、value_columnのベース値を提供する列にする必要があります。DENSE
参照の場合、このベース列は必要ありません。 -
expression_listの式の数は、value_columnで定義した、参照表で定義されている参照キー列の数と同じにする必要があります。また、式リストで指定した式は、参照キー列と1対1で順番に一致している必要があります。
たとえば:
-
参照表ProductName_TRANSの参照キーは、Product_codeおよびLanguage_Keyの両方です。
-
expression_listの式は、SnowflakeSales.Product.ProductIDおよびVALUEOF(NQ_SESSION."LANGUAGE")です。
-
この参照の意味を次に示します。
Product_code = SnowflakeSales.Product.ProductIDおよびLanguage_Key = VALUEOF(NQ_SESSION."LANGUAGE")という条件を使用して、翻訳表からProductNameの翻訳済の値を戻します。
-
論理参照列の作成
参照関数を含む論理列を作成するには、セマンティック・モデラーで式ビルダーを使用します。
論理列の値は、現在のユーザーに関連付けられている言語に基づきます。
論理列は、論理表の「列」タブにある列プロパティ・ペインで派生列式を使用して作成します。「派生列の作成」を参照してください。
たとえば、翻訳済の製品名を取得するには:
INDEXCOL( VALUEOF(NQ_SESSION."LAN_INT"), "Translated Lookup Tables"."Product". "ProductName",
LOOKUP( DENSE "Translated Lookup Tables"."Product Translations". "ProductName", "Translated Lookup Tables"."Product"."ProductID", VALUEOF(NQ_SESSION."WEBLANGUAGE")))
LAN_INT
はセッション初期化ブロックMLSにより移入されるセッション変数で、基本言語または他の言語を表します。
-
基本言語(たとえば、en - English)の場合は0
-
他の言語コード(たとえば、fr - Frenchまたはcn - Chinese)の場合は1
WEBLANGUAGE
は、ユーザーがログイン時に選択した言語に基づいて自動的に初期化されるセッション変数です。
INDEXCOL
関数は、適切な列の選択をサポートします。前述の例では、ユーザー言語が基本言語の場合(つまり、セッション変数LAN_INT
の値が0の場合)にのみ、基本列(ProductName)の値が戻されます。ユーザー言語が基本言語でない場合(セッション変数LAN_INT
の値が1の場合)は、WEBLANGUAGE
セッション変数に渡された言語の参照表から値が戻されます。
(前述の例の) DENSE
関数を使用する場合、翻訳対象言語の列に値がないと、参照関数により空白のエントリが表示されます。
(次の例の)SPARSE
関数を使用する場合、翻訳対象言語の列に値がないと、参照関数により基本言語で対応する値が表示されます。
INDEXCOL( VALUEOF(NQ_SESSION."LAN_INT"), "Translated Lookup Tables"."Product".
"ProductName", LOOKUP( SPARSE "Translated Lookup Tables"."Product Translations".
"ProductName", "Translated Lookup Tables"."Product"."ProductName", "Translated
Lookup Tables"."Product"."ProductID", VALUEOF(NQ_SESSION."WEBLANGUAGE")))