29.05.2013, 12:54 | #1 |
----------------
|
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 |
Участник
|
Цитата:
Сравните Код: select ... where (exists join ... where (not exists join ...)) Код: select ... where (exists join ... ) and (not exists join ...) |
|
29.05.2013, 13:27 | #3 |
----------------
|
да, я в курсе, это относится и к простым последующим join
только в MS про это, похоже, забыли. |
|
29.05.2013, 13:32 | #4 |
Участник
|
Цитата:
Сообщение от 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; |
|
30.05.2013, 10:45 | #5 |
Developer
|
Хорошо, что хоть с помощью Query можно реализовать несколько exist/notexists join к одному DS...
|
|
30.05.2013, 12:36 | #6 |
Участник
|
В 3.0 с Query была точно такая же проблема; в 2009-й уже лишние группирующие круглые скобки в запросе не добавляются, поэтому стало возможно создавать необходимые запросы.
|
|
|
За это сообщение автора поблагодарили: vallys (2). |
30.05.2013, 12:55 | #7 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: IKA (1). |
16.09.2020, 21:45 | #8 |
Участник
|
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; 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. |
|