Qlik Community

Россия и СНГ

Announcements
June 28, 10AM ET: Qlik Nation and Qlik Community present: CyberSleuth REGISTER TODAY
cancel
Showing results for 
Search instead for 
Did you mean: 
denis585
Contributor III
Contributor III

Left Keep и Right Keep одной таблицы

Здравствуйте.

Left Keep и Right Keep одной и той же таблицы дают разные результаты.

Так должно быть?

Спасибо.

1 Solution

Accepted Solutions
dima1987
Contributor II
Contributor II

Добрый день.

Логично.

KEEP  идет по составному ключу, который тут- суть все поля таблицы. 

Соответственно если хоть одно поле null, то ключ  не определен.

Таким образом при left  в первой таблице будут все строки, а во второй только 351 строка, где нет null,

при right наоборот.

А так как вторую таблицу мы дропаем, то и получаем при right keep таблицу с 351 строкой, которые без null.

View solution in original post

9 Replies
Eugeny_Ilyin
Creator II
Creator II

День добрый.
Интересно.

По логике должно быть столько же записей как в первой таблице.
left отрабатывает нормально, right спотыкается на пустых записях.

Скорей всего особенность, чем глюк. Связано с внутренним представлением пустых записей.
Сделайте так:
Сначала загрузите две копии одной таблицы, а потом соединяйте хоть слева хоть справа.
В этом случае все будет логично.

dima1987
Contributor II
Contributor II

Добрый день.

Логично.

KEEP  идет по составному ключу, который тут- суть все поля таблицы. 

Соответственно если хоть одно поле null, то ключ  не определен.

Таким образом при left  в первой таблице будут все строки, а во второй только 351 строка, где нет null,

при right наоборот.

А так как вторую таблицу мы дропаем, то и получаем при right keep таблицу с 351 строкой, которые без null.

Eugeny_Ilyin
Creator II
Creator II

Дмитрий, немного не согласен.

Если хоть одно поле NULL ключ все равно формируется. Просто внутреннее представление о Нуле во время LOAD и после LOAD не совпадают. Думаю поэтому.
Иначе подобный результат повторялся бы и на объединении двух резидентных таблиц, которые прошли LOAD без дополнительных операций и только потому идут на вычисление right keep .

denis585
Contributor III
Contributor III
Author

Поясните, пожалуйста, чуть подробнее

Имеем Таб1

A B

1 Null

2 Text

Какие будут составные ключи Left и Right

и по какому алгоритму действует Keep?

Спасибо.

dima1987
Contributor II
Contributor II

Евгений, так результат повторяется.

"

Tab01:

LOAD  *

FROM 

[..\3_qvd\Tab01.qvd]

(qvd);

STORE Tab01 into [..\3_qvd\Tab01.qvd];

NoConcatenate

Tab02:

LOAD  *

Resident Tab01;

Inner Keep (Tab02)

LOAD *

Resident Tab01;

"

В таблицах соответственно 23476, 351,351 строк. Или я что-то не так понял.

dima1987
Contributor II
Contributor II

Left keep:                                                         

tab1:                    tab2:

A  B                    A  B

1  null                 2   text   

2  text

right keep:

tab1:                    tab2:

A  B                    A  B

2  text                 1  null 

                          2   text   

inner keep:

tab2:                    tab1:

A  B                    A  B                        

2   text                2  text

Ключ: A & B ;

Вроде бы так. Правда непонятно, почему set NullValue = '♫' ... NullAsValue;

не помогло решить проблему.

denis585
Contributor III
Contributor III
Author

Понятно, т.е. для достижения одинаковых результатов 23476 строк в случае Right Keep нужно дропать Tab01.

Спасибо Всем участникам за обсуждение.

Eugeny_Ilyin
Creator II
Creator II

Дмитрий, извиняюсь.
Действительно на приведенном примере результат играет, только у меня теперь на левом соединении делает обрезку строк.

А вот на тесте как ни крути результат один:

tab01:

LOAD * INLINE [

    F1, F2

    1, AA

    2

      , CC

    4

    5, AA

];

tab02:

NoConcatenate

LOAD * Resident tab01;

tab03:

Right Keep(tab01) load * Resident tab02;

DROP Tables tab01, tab02;

Eugeny_Ilyin
Creator II
Creator II

Или избавляться от пустых значений.