![]() |
#1 |
Участник
|
![]()
Как должна выполнятся конструкция вида
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. Естественно результат такой выборки мало предсказуем. Данный баг уже был описан ранее? Или это фича такая? |
|
![]() |
#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
__________________
Возможно сделать все. Вопрос времени |
|
![]() |
#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) |
|
![]() |
#4 |
Administrator
|
А, я понял. Дело в том, что Аксапта сама не генерит JOIN-конструкции. А без JOIN-конструкции нельзя будет связать как Вы хотите - до группировки. При этом, замечу, что группировка заведомо предполагает перечисление в явном виде полей для выборки (чего кстати говоря нет в Вашем исходном примере у 2-й таблицы) и группировки.
Пример, который я написал про SQL-запрос намеренно написан именно так. Ваш вариант PHP код:
PS. Теперь окончательно понял ![]()
__________________
Возможно сделать все. Вопрос времени |
|
![]() |
#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. |
|
![]() |
#6 |
Участник
|
Цитата:
Сообщение от sukhanchik
![]() Ваш вариант
PHP код:
|
|
![]() |
#7 |
Участник
|
Сейчас проверил на AX2012 порядок работы для постоянных и временных(InMemory) таблиц попрежнему отличается
![]() |
|
Теги |
bug, баг, временная таблица, запрос (query), ошибка |
|
![]() |
||||
Тема | Ответов | |||
Проблемы с Exists Join | 28 | |||
Данные в Grid из таблиц, связанных по Outer Join | 2 | |||
Проблема с Exists Join | 5 | |||
outer join для трех таблиц | 4 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|