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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.03.2008, 14:12   #1  
Paul_ST is offline
Paul_ST
Участник
 
144 / 11 (1) +
Регистрация: 26.11.2003
Адрес: Екатеринбург
Не отрабатывает запрос EXISTS JOIN
Подскажите, пожалуйста - пишу (Axapta 3.0 SP4) такой элементарный запрос:
X++:
    while select custInvTr
        exists join invTable
            where custInvTr.ItemId == invTable.ItemId
    {
        info(StrFmt("%1", invTable.ItemId));
    }
он выводит пустые строки. Курсор invTable внутри цикла пустой. Стоит только убрать ключевое слово exists - и непустые данные в инфолог выводятся.
В чём тут дело?
P.S. столкнувшись с таким глюком в тестовой конфигурации, перешёл в чистую конфигурацию, где мало данных и можно беспечно - запускать такие вот запросы.
__________________
Paul_ST
Старый 18.03.2008, 14:25   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Ну, тут, батенька, на себя только пенять, что не знаете, как работает exists join.
Здесь ошибки никакой нет.
exists join для того и существует, чтобы уменьшить объем выбираемых данных.
Его стоит использовать, когда нужны только данные первой таблицы.

Если же нужны данные и из подчиненной таблицы, то используется обычный join. В плане соединения таблиц они ничем не отличаются.
Старый 18.03.2008, 14:37   #3  
Paul_ST is offline
Paul_ST
Участник
 
144 / 11 (1) +
Регистрация: 26.11.2003
Адрес: Екатеринбург
Спасибо за ответ!

Ещё раз внимательно прочитал Руководство разработчика. Там достаточно туманно , получается описывается exists join, равно как и outer.

Я всегда , почему-то, считал, что exists join отличается от inner join'а тем, что вытаскиваются все записи главной таблицы и одна из соответствующих записей приджойненной (если есть таковая). А если нет соответствующей, то ничего из приджойненной не тянется.
Однако, как мне казалось - запись из приджойненной таблицы в курсор подтягивается. Ан нет

Натолкнулся на это только сейчас, поскольку до этого использовал курсоры - приджойненный через exists join исключительно для фильтрации. А сейчас захотел оттуда значения некоторых полей брать.
Век живи, век учись!
__________________
Paul_ST
Старый 19.03.2008, 11:23   #4  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Если же нужны данные и из подчиненной таблицы, то используется обычный join. В плане соединения таблиц они ничем не отличаются.
Простите, не смог пропустить.
Отличаются очень многим.
Цитата:
Натолкнулся на это только сейчас, поскольку до этого использовал курсоры - приджойненный через exists join исключительно для фильтрации. А сейчас захотел оттуда значения некоторых полей брать.
Век живи, век учись!
exists join исключительно для фильтрации - совершенно верные слова
Все-таки надо хотя бы немного изучить обычный SQL, чтобы понимать, что же реально происходит с вашими данными.
Старый 19.03.2008, 12:38   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
2 Wamr: А чем отличаются? Или имеется в виду, что отличаются тем, как непосредственно соединение их выполняется?

Потому что с точки зрения результата, как я вижу, ничем.
В смысле, что получаем те же строки, как если бы использовали обычный join, но только из первой таблицы.

Можно ответить ссылочкой - я люблю читать
Старый 19.03.2008, 13:08   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от kashperuk Посмотреть сообщение
А чем отличаются? Потому что с точки зрения результата, как я вижу, ничем.
В плане результата отличаются, к примеру, тем, что при inner join и связи 1:n возвращаемые записи из "левой" таблицы могут "задвоиться", т.е. одна и та же запись будет возвращена несколько раз, если ей соответствуют несколько записей из "правой" таблицы; при exist join такого не происходит.
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Или имеется в виду, что отличаются тем, как непосредственно соединение их выполняется?
Это тоже нельзя игнорировать. Использование exist join приводит к возникновению кучи подзапросов (во всяком случае, на Oracle), что очень негативно сказывается на производительности.
За это сообщение автора поблагодарили: kashperuk (5).
Старый 19.03.2008, 13:35   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А, ну да. Для 1:n действительно разница есть. Спасибо
А вот про подзапросы - я помню, что читал где-то, что после какого-то сервис пака подзапросы уже не создаются. Или на Оракле так и дальше создаются? На 4.0?
Старый 20.03.2008, 23:07   #8  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Цитата:
Сообщение от kashperuk Посмотреть сообщение
А, ну да. Для 1:n действительно разница есть. Спасибо
А вот про подзапросы - я помню, что читал где-то, что после какого-то сервис пака подзапросы уже не создаются. Или на Оракле так и дальше создаются? На 4.0?
Создают на 2005 сиквеле на 4.0 за милую душу

На мой взгляд, главная опасность в использовании exists join - это получение непредсказуемого плана исполнения запроса.
Старый 21.03.2008, 17:21   #9  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Так как же тогда "правильней" проверять наличие соответствующих записей в другой таблице? Inner Join c проверкой дубликатов? Отдельный запрос? Зачитывать заранее?
Такая обычная задачка, а в каждом конкретном случае оптимальная реализация может отличаться...

Последний раз редактировалось vallys; 21.03.2008 в 17:25.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблемы с Exists Join Logger DAX: Программирование 28 28.04.2010 02:54
Почему join запрос разбивается на подзапросы!? 3oppo DAX: Программирование 59 28.06.2007 11:52
Проблема с Exists Join Morpheus DAX: Программирование 5 14.08.2006 18:22
Как добавить к запросу еще один источник по EXISTS JOIN Lucky13 DAX: Программирование 6 29.11.2005 15:05

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

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

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