29.01.2009, 17:03 | #1 |
Участник
|
Порядок выполнения GroupBy и Exists Join для временных таблиц
Как должна выполнятся конструкция вида
X++: while select tmpTable1 group by GroupId exists join tmpTable2 where tmpTable2.Id == tmpTable1.Id По аналогии с постоянными таблицами можно предположить, что сначала из таблицы tmpTable1 выберутся строкии, Id которых соответствуют строкам из таблицы tmpTable2. И затем отобранные строки сгруппируются по полю GroupId. На практике же оказывается что group by отрабатывает первым. Причём значение поля id не обнуляется, а становится равным значению из первой строки группы (первой по очерёдности вставки). И вот уже с этими Id продолжает работать exists join. Естественно результат такой выборки мало предсказуем. Данный баг уже был описан ранее? Или это фича такая? |
|
29.01.2009, 21:13 | #2 |
Administrator
|
Может я конечно чего-то не догоняю, но Вы видимо ожидаете увидеть поле GroupId пустым? В Аксапте контсрукция типа
X++: select tmpTable1 group by GroupId X++: select GroupId from tmpTable1 group by GroupId И потом - описанная Вами конструкция преобразуется в SQL вида X++: SELECT GROUPID FROM TMPTABLE1 WHERE TMPTABLE1.GROUPID EXISTS IN (SELECT * FROM TMPTABLE2 WHERE TMPTABLE2.GROUPID = TMPTABLE1.GROUPID) GROUP BY GROUPID
__________________
Возможно сделать все. Вопрос времени |
|
29.01.2009, 22:34 | #3 |
Участник
|
в моём примере запрос имеет немного другой вид
Код: SELECT GROUPID FROM TMPTABLE1 WHERE TMPTABLE1.GROUPID EXISTS IN (SELECT * FROM TMPTABLE2 WHERE TMPTABLE2.ID = TMPTABLE1.ID) GROUP BY GROUPID Код: SELECT T.GROUPID FROM (SELECT GROUPID, MIN(ID) FROM TMPTABLE1 GROUP BY GROUPID) AS T WHERE EXISTS(SELECT * FROM TMPTABLE2 WHERE TMPTABLE2.ID = T.ID) |
|
29.01.2009, 23:16 | #4 |
Administrator
|
А, я понял. Дело в том, что Аксапта сама не генерит JOIN-конструкции. А без JOIN-конструкции нельзя будет связать как Вы хотите - до группировки. При этом, замечу, что группировка заведомо предполагает перечисление в явном виде полей для выборки (чего кстати говоря нет в Вашем исходном примере у 2-й таблицы) и группировки.
Пример, который я написал про SQL-запрос намеренно написан именно так. Ваш вариант PHP код:
PS. Теперь окончательно понял Т.е. конструкция самого запроса принципиально меняется. Это конечно интересно проверить. Однако - дело в том, что временные таблицы не всегда джойнятся с группировкой как у Вас, да еще связываясь по полю, не участвующему в группировке. В системе часто используются всякие Map, Set, RecordSortedList и прочие конструкции, торчащие в памяти (в частности при разноске). Временная таблица как правило нужна, чтобы в нее запихнуть конкретные данные для вывода в форму/отчет. И джойнить с ней подразумевается только справочники (т.е. без группировок и exists join). Конечно наверняка найдутся примеры и такого использования кода, но....сначала было бы неплохо их глянуть - чтобы понять где они есть и отрабатывают ли они вообще в России (т.к. форум в основном используется людьми, использующих российскую локализацию).
__________________
Возможно сделать все. Вопрос времени |
|
30.01.2009, 08:09 | #5 |
Участник
|
Вот набрасал небольшой пример
X++: static void TEST_Job(Args _args) { TEST_tmpTable1 TEST_tmpTable1; TEST_tmpTable2 TEST_tmpTable2; ; //----------------------------------------------- TEST_tmpTable1.GroupId = '01'; TEST_tmpTable1.Id = 1; TEST_tmpTable1.insert(); TEST_tmpTable1.Id = 2; TEST_tmpTable1.insert(); TEST_tmpTable1.GroupId = '02'; // Но если следующие две строки кода поменять местами, // то результат будет другой TEST_tmpTable1.Id = 4; TEST_tmpTable1.insert(); TEST_tmpTable1.Id = 3; TEST_tmpTable1.insert(); TEST_tmpTable2.Id = 1; TEST_tmpTable2.insert(); TEST_tmpTable2.Id = 3; TEST_tmpTable2.insert(); //----------------------------------------------- while select TEST_tmpTable1 group by GroupId exists join TEST_tmpTable2 where TEST_tmpTable2.Id == TEST_tmpTable1.Id { info(TEST_tmpTable1.GroupId); } } Последний раз редактировалось S.Kuskov; 30.01.2009 в 08:21. |
|
30.01.2009, 09:06 | #6 |
Участник
|
Цитата:
Сообщение от sukhanchik
Ваш вариант
PHP код:
|
|
06.12.2012, 16:55 | #7 |
Участник
|
Сейчас проверил на AX2012 порядок работы для постоянных и временных(InMemory) таблиц попрежнему отличается
|
|
Теги |
bug, баг, временная таблица, запрос (query), ошибка |
|
Похожие темы | ||||
Тема | Ответов | |||
Проблемы с Exists Join | 28 | |||
Данные в Grid из таблиц, связанных по Outer Join | 2 | |||
Проблема с Exists Join | 5 | |||
outer join для трех таблиц | 4 |
|