0

QlikView には、テーブルDataと 1 つのデータベース テーブルAがあります。テーブルAは 2 回使用する必要があります ( A_LeftA_Right )。(テーブル A には数千のエントリが含まれる場合があります。)

私のロードスクリプトは次のとおりです。

A_Left:
Load a_id_left,
     a_name_left
inline [
  a_id_left, a_name_left
  1, 'nwsnd'
  2, 'dcsdcws'
  3, 'fsdf'    ];

A_Rigtht:
Load a_id_right,
     a_name_right
inline  [
  a_id_right, a_name_right
  1, 'nwsnd'
  2, 'dcsdcws'
  3, 'fsdf'    ];

Data:
Load id, 
     a_id_left,
     a_name_left as 'Name_Left',
     a_id_right,
     a_name_right as 'Name_Right',
     data
inline [
  id, a_id_left, a_right_id, data
  1, 1, 2, 37
  1, 1, 3, 18
  1, 2, 3, 62
];

私の質問は次のとおりです。QlikView でルックアップ テーブルを使用する最良の方法は何ですか? ( MAPPINGand/orを使用する必要がありApplyMapますか?なぜですか?そのほうが速いですか?)

質問のもう1つの部分は、データ構造をスターからテーブルに変更するのに役立つでしょうか? (メモリの消費量が増えることはわかっています。) ところで、すべてのデータを 1 つのテーブルに格納して、1 つの QVD ファイルに完全に格納するにはどうすればよいでしょうか?

アイデアを助けてくれてありがとう。

4

2 に答える 2

1

別の値から単一の値を検索したい単純な検索では、MAPPINGロードを使用してからApplyMap()関数を使用できます。たとえば、次のテーブルがあるとします。

LOAD
   *
INLINE [
   UserID, System
   1, Windows
   2, Linux
   3, Windows
];

次のように、UserID と UserName を含む別のテーブルがあります。

LOAD
   *
INLINE [
   UserID, UserName
   1, Alice
   2, Bob
   3, Carol
];

ApplyMap次に、上記のテーブルを次のように組み合わせることができます。

UserNameMap:
MAPPING LOAD
   *
INLINE [
   UserID, UserName
   1, Alice
   2, Bob
   3, Carol
];

SystemData:
LOAD
   UserID,
   ApplyMap('UserNameMap', UserID, 'MISSING') as UserName,
   System
INLINE [
   UserID, System
   1, Windows
   2, Linux
   3, Windows
];

ApplyMap は非常に高速で、ロード時間が大幅に遅くなることはありません (ただし、QVD の直接ロードほど速くはありません)。ただし、前述のように、ApplyMap は、単一の値をテーブルにマップする場合にのみ使用できます。joinより多くのフィールドについて、結果を 1 つのテーブルに結合する場合は (SQL JOIN に似ています)を使用する必要があります。

それらを 1 つのテーブルに結合したくない場合 (ただし、「スター」スキームのままにしておく場合) は、リンクするフィールドの名前が同じであることを確認してください。例えば:

A_Left:
Load a_id_left,
     a_name_left as [Name_Left]
inline [
  a_id_left, a_name_left
  1, 'nwsnd'
  2, 'dcsdcws'
  3, 'fsdf'    ];

A_Rigtht:
Load a_id_right,
     a_name_right as [Name_Right]
inline  [
  a_id_right, a_name_right
  1, 'nwsnd'
  2, 'dcsdcws'
  3, 'fsdf'    ];

Data:
Load id, 
     a_id_left,
     a_id_right,
     data
inline [
  id, a_id_left, a_right_id, data
  1, 1, 2, 37
  1, 1, 3, 18
  1, 2, 3, 62
];

(ロードに失敗するため、「データ」から「名前」フィールドを削除しました)。

これは、QlikView の自動フィールド結合により、QlikView ドキ​​ュメントで機能します。

ただし、データを 1 つのテーブルに格納したい場合 (QVD への出力など) JOIN、2 つのテーブルをData. テーブルのいくつかを再配置して、生活を少し楽にすることができます。Dataテーブルを最初に配置すると、他の2つのテーブルを結合できます。

Data:
Load id, 
     a_id_left,
     a_id_right,
     data
inline [
  id, a_id_left, a_id_right, data
  1, 1, 2, 37
  1, 1, 3, 18
  1, 2, 3, 62
];

LEFT JOIN (Data)
Load a_id_left,
     a_name_left as [Name_Left]
inline [
  a_id_left, a_name_left
  1, 'nwsnd'
  2, 'dcsdcws'
  3, 'fsdf'    ];

LEFT JOIN (Data)
Load a_id_right,
     a_name_right as [Name_Right]
inline  [
  a_id_right, a_name_right
  1, 'nwsnd'
  2, 'dcsdcws'
  3, 'fsdf'    ];

これは、「データ」という名前の単一のテーブルに再分類され、QVD などに出力できます。

「テーブル A」の抽出はほぼ 2 回読み込まれるため、最適化を検討することをお勧めします。これには (長距離サーバーなどから) 時間がかかる場合があるため、一度にデータを取得してからスライスする方がよい場合があります。それがメモリに入ったら(はるかに高速です)。簡単な例は次のようになります。

TableA:
LOAD
     a_id_left,
     a_id_right,
     a_name_left,
     a_name_right
FROM ...;

Data:
Load id, 
     a_id_left,
     a_id_right,
     data
inline [
  id, a_id_left, a_id_right, data
  1, 1, 2, 37
  1, 1, 3, 18
  1, 2, 3, 62
];

LEFT JOIN (Data)
LOAD DISTINCT
     a_id_left,
     a_name_left as [Name_Left]
RESIDENT TableA;

LEFT JOIN (Data)
LOAD DISTINCT
     a_id_right,
     a_name_right as [Name_Right]
RESIDENT TableA;

DROP TABLE TableA;
于 2014-05-06T23:09:48.680 に答える
0

最後の部分に答えるには、CONCATENATE 関数を使用して、あるテーブルの内容を別のテーブルに追加できます。

Final:
Load *
from
   Table1

CONCATENATE

Load *
from
   Table2

Table1 と Table2 の内容がマージされた Final という 1 つのテーブルが提供されます。

于 2013-10-11T08:21:30.163 に答える