2013-10-07 2 views
0

В QlikView у меня есть таблица Данные и одна таблица базы данных A. Таблица A следует использовать дважды (A_Left, A_Right). (Таблица А может иметь тысячи записей.)Каков наилучший способ использования таблиц поиска в QlikView?

Мой сценарий нагрузки:

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? (Должен ли я использовать MAPPING и/или ApplyMap Почему это быстрее??)

одна часть вопроса: Будет ли это поможет изменить структуру данных от звезды к таблице? (Я знаю, что это будет стоить больше памяти.) И, между прочим: как я могу поместить все данные в одну таблицу , чтобы я мог полностью сохранить его в одном файле QVD?

Спасибо за помощь.

ответ

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 (который похож на SQL JOIN), если вы хотите объединить результаты в одну таблицу.

Если вы не хотите присоединяться к ним в одну таблицу (но сохраняйте ее как схему «звезда»), просто убедитесь, что поля, которые вы хотите связать, называются одинаковыми. Например:

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.

Однако, если вы хотите иметь данные в одной таблице (например,для вывода на QVD), то в вашем случае вам нужно будет JOIN ваших двух таблиц в Data. Мы можем изменить некоторые таблицы, чтобы сделать нашу жизнь немного легче, если положить ваш Data стол первым, мы можем присоединиться к своим двум другим таблицам на:

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 и т. Д.

Возможно, вы захотите подумать об оптимизации вашего эквалайзера «Таблица А», так как он почти загружен дважды, это может занять некоторое время (например, с сервера дальней связи и т. Д.), поэтому может быть лучше захватить ваши данные за один раз, а затем разрезать его, как только он будет в памяти (намного быстрее). Быстрый пример может быть следующим:

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; 
0

Чтобы ответить на последнюю часть, вы можете использовать функцию СЦЕПИТЬ, чтобы добавить содержимое одной таблицы в anoher, т.е.

Final: 
Load * 
from 
    Table1 

CONCATENATE 

Load * 
from 
    Table2 

даст вам одну таблицы, которая называется Final с присоединяемым содержанием Table1 и Table2 ,

Смежные вопросы