AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 29.05.2013, 12:54   #1  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 868 (32) +++++++
Join Date: 15.01.2002
Location: Москва
Blog Entries: 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 это не воспроизводится

Last edited by Wamr; 29.05.2013 at 12:58.
This post has been rated by: lev (5), MikeR (3), A_BAS (2).
Old 29.05.2013, 13:22   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1792 (66) ++++++++
Join Date: 28.04.2007
Location: Калуга
Quote:
Originally Posted by Wamr View Post
Ошибка известная с давних времен.
Если в запросе использовать notexists join, то последующие exists & notexists не работают.
Они работают, но только не так как ожидаешь. Каждый следующий exists / notexists относится не к первому курсору и не к результату предыдущих соединений а непосредственно с вышестоящему курсору.

Сравните
Code:
select ... where (exists join ... where (not exists join ...))
И
Code:
select ... where (exists join ... ) and  (not exists join ...)
Old 29.05.2013, 13:27   #3  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 868 (32) +++++++
Join Date: 15.01.2002
Location: Москва
Blog Entries: 7
да, я в курсе, это относится и к простым последующим join
только в MS про это, похоже, забыли.
Old 29.05.2013, 13:32   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (201) ++++++++++
Join Date: 28.11.2005
Location: Москва
Blog Entries: 3
Quote:
Originally Posted by Wamr View Post
Ошибка известная с давних времен. Небольшой пример на 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++ вообще невозможно реализовать - только подзапросами проверять...
Old 30.05.2013, 10:45   #5  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Join Date: 18.01.2005
Хорошо, что хоть с помощью Query можно реализовать несколько exist/notexists join к одному DS...
Old 30.05.2013, 12:36   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (201) ++++++++++
Join Date: 28.11.2005
Location: Москва
Blog Entries: 3
В 3.0 с Query была точно такая же проблема; в 2009-й уже лишние группирующие круглые скобки в запросе не добавляются, поэтому стало возможно создавать необходимые запросы.
This post has been rated by: vallys (2).
Old 30.05.2013, 12:55   #7  
Мартынов Дмитрий is offline
Мартынов Дмитрий
Участник
 
236 / 66 (3) ++++
Join Date: 02.02.2004
Location: г. Москва
:)
Quote:
Originally Posted by Wamr View Post
да, я в курсе, это относится и к простым последующим join
только в MS про это, похоже, забыли.
Они, что ? Не тестируют то что написали ? Откройте нам страшную тайну...
This post has been rated by: IKA (1).
Old 16.09.2020, 21:45   #8  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Товарищ ♂uatr's Avatar
MCBMSS
 
324 / 903 (31) +++++++
Join Date: 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;
Маловероятно, что найдутся желающие поддерживать такой код.

Last edited by Товарищ ♂uatr; 16.09.2020 at 21:49.
 

Similar Threads
Thread Thread Starter Forum Replies Last Post
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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 08:32.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.