Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Здравствуйте.
Left Keep и Right Keep одной и той же таблицы дают разные результаты.
Так должно быть?
Спасибо.
Добрый день.
Логично.
KEEP идет по составному ключу, который тут- суть все поля таблицы.
Соответственно если хоть одно поле null, то ключ не определен.
Таким образом при left в первой таблице будут все строки, а во второй только 351 строка, где нет null,
при right наоборот.
А так как вторую таблицу мы дропаем, то и получаем при right keep таблицу с 351 строкой, которые без null.
День добрый.
Интересно.
По логике должно быть столько же записей как в первой таблице.
left отрабатывает нормально, right спотыкается на пустых записях.
Скорей всего особенность, чем глюк. Связано с внутренним представлением пустых записей.
Сделайте так:
Сначала загрузите две копии одной таблицы, а потом соединяйте хоть слева хоть справа.
В этом случае все будет логично.
Добрый день.
Логично.
KEEP идет по составному ключу, который тут- суть все поля таблицы.
Соответственно если хоть одно поле null, то ключ не определен.
Таким образом при left в первой таблице будут все строки, а во второй только 351 строка, где нет null,
при right наоборот.
А так как вторую таблицу мы дропаем, то и получаем при right keep таблицу с 351 строкой, которые без null.
Дмитрий, немного не согласен.
Если хоть одно поле NULL ключ все равно формируется. Просто внутреннее представление о Нуле во время LOAD и после LOAD не совпадают. Думаю поэтому.
Иначе подобный результат повторялся бы и на объединении двух резидентных таблиц, которые прошли LOAD без дополнительных операций и только потому идут на вычисление right keep .
Поясните, пожалуйста, чуть подробнее
Имеем Таб1
A B
1 Null
2 Text
Какие будут составные ключи Left и Right
и по какому алгоритму действует Keep?
Спасибо.
Евгений, так результат повторяется.
"
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 строк. Или я что-то не так понял.
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;
не помогло решить проблему.
Понятно, т.е. для достижения одинаковых результатов 23476 строк в случае Right Keep нужно дропать Tab01.
Спасибо Всем участникам за обсуждение.
Дмитрий, извиняюсь.
Действительно на приведенном примере результат играет, только у меня теперь на левом соединении делает обрезку строк.
А вот на тесте как ни крути результат один:
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;
Или избавляться от пустых значений.