AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.05.2013, 12:54   #1  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
AX2009. Не используйте NotExists
Ошибка известная с давних времен.
Если в запросе использовать notexists join, то последующие exists & notexists не работают.
Небольшой пример на AX2009RU8:
X++:
static void JobNotExists(Args _args)
{
    InventTable     inventTable;
    InventTable     inventTableE;
    InventTable     inventTableNE;
    
    ItemId          itemId = '1001', itemIdne = '1001notFound';
    ;
    
    // Убедимся, что такая запись есть
    select itemId from inventTable
        where inventTable.ItemId == itemId;
        
    info(inventTable.ItemId);

    // Убедимся, что такая ItemId есть, а ItemIdne нет
    select itemId from inventTable
        where inventTable.ItemId == itemId
    notexists join inventTableNE
        where inventTableNE.ItemId == itemIdne;

    info(inventTable.ItemId);

    // Здесь exists возвращает false, но на результате это не сказывается
    select itemId from inventTable
        where inventTable.ItemId == itemId
    notexists join inventTableNE
        where inventTableNE.ItemId == itemIdne
    exists join inventTableE
        where inventTableE.ItemId == itemIdne;

    error(inventTable.ItemId);

    // Здесь второй notexists возвращает false, но на результате это не сказывается
    select itemId from inventTable
        where inventTable.ItemId == itemId
    notexists join inventTableE
        where inventTableE.ItemId == itemIdne
    notexists join inventTableNE
        where inventTableNE.ItemId == inventTable.ItemId;

    error(inventTable.ItemId);
}
Почему вспомнил?
Встретил в HRP несколько примеров такого кода с макросом TransLinkNotExistsReversed_RU

P.S. Сейчас не могу проверить, но помнится на Oracle это не воспроизводится

Последний раз редактировалось Wamr; 29.05.2013 в 12:58.
За это сообщение автора поблагодарили: lev (5), MikeR (3), A_BAS (2).
Старый 29.05.2013, 13:22   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Wamr Посмотреть сообщение
Ошибка известная с давних времен.
Если в запросе использовать notexists join, то последующие exists & notexists не работают.
Они работают, но только не так как ожидаешь. Каждый следующий exists / notexists относится не к первому курсору и не к результату предыдущих соединений а непосредственно с вышестоящему курсору.

Сравните
Код:
select ... where (exists join ... where (not exists join ...))
И
Код:
select ... where (exists join ... ) and  (not exists join ...)
Старый 29.05.2013, 13:27   #3  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
да, я в курсе, это относится и к простым последующим join
только в MS про это, похоже, забыли.
Старый 29.05.2013, 13:32   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Wamr Посмотреть сообщение
Ошибка известная с давних времен. Небольшой пример на AX2009RU8:
X++:
// Здесь второй notexists возвращает false, но на результате это не сказывается
    select itemId from inventTable
        where inventTable.ItemId == itemId
    notexists join inventTableE
        where inventTableE.ItemId == itemIdne
    notexists join inventTableNE
        where inventTableNE.ItemId == inventTable.ItemId;
К слову, в данном случае ожидаемый запрос (два независимых notexists join'а, привязанных к одной исходной таблице), похоже, на X++ вообще невозможно реализовать - только подзапросами проверять...
Старый 30.05.2013, 10:45   #5  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Хорошо, что хоть с помощью Query можно реализовать несколько exist/notexists join к одному DS...
Старый 30.05.2013, 12:36   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
В 3.0 с Query была точно такая же проблема; в 2009-й уже лишние группирующие круглые скобки в запросе не добавляются, поэтому стало возможно создавать необходимые запросы.
За это сообщение автора поблагодарили: vallys (2).
Старый 30.05.2013, 12:55   #7  
Мартынов Дмитрий is offline
Мартынов Дмитрий
Участник
 
236 / 66 (3) ++++
Регистрация: 02.02.2004
Адрес: г. Москва
:)
Цитата:
Сообщение от Wamr Посмотреть сообщение
да, я в курсе, это относится и к простым последующим join
только в MS про это, похоже, забыли.
Они, что ? Не тестируют то что написали ? Откройте нам страшную тайну...
За это сообщение автора поблагодарили: IKA (1).
Старый 16.09.2020, 21:45   #8  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
305 / 873 (30) +++++++
Регистрация: 23.10.2012
X++:
// Здесь второй notexists возвращает false, но на результате это не сказывается
    select itemId from inventTable
        where inventTable.ItemId == itemId
    notexists join inventTableE
        where inventTableE.ItemId == itemIdne
    notexists join inventTableNE
        where inventTableNE.ItemId == inventTable.ItemId;
Как бы это абсурдно не звучало, но проблему можно решить заменив второй notexists на exists и сместив условие выборки полей:
X++:
select itemId from inventTable
    where inventTable.ItemId == itemId
notexists join inventTableE
exists join inventTableNE
    where inventTableNE.ItemId == itemId
       && inventTableE.ItemId  == itemId;
Маловероятно, что найдутся желающие поддерживать такой код.

Последний раз редактировалось Товарищ ♂uatr; 16.09.2020 в 21:49.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axinthefield: Choosing a Single Deployment or Multiple Deployments of AX2009 Blog bot DAX Blogs 0 15.06.2011 03:25
sumitax: SharePoint 2010 and AX2009 Blog bot DAX Blogs 0 11.11.2010 11:11
Shekhar: Dynamics AX2009 : Standalone Installation on Vista with Role centres and workflow. Blog bot DAX Blogs 0 30.03.2010 15:05
ax2009 & SSRS kitty DAX: Программирование 6 02.04.2009 10:38
Не работают 2 notexists join savel DAX: Программирование 13 23.07.2004 13:49

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:41.