18.03.2008, 14:12 | #1 |
Участник
|
Не отрабатывает запрос EXISTS JOIN
Подскажите, пожалуйста - пишу (Axapta 3.0 SP4) такой элементарный запрос:
X++: while select custInvTr exists join invTable where custInvTr.ItemId == invTable.ItemId { info(StrFmt("%1", invTable.ItemId)); } В чём тут дело? P.S. столкнувшись с таким глюком в тестовой конфигурации, перешёл в чистую конфигурацию, где мало данных и можно беспечно - запускать такие вот запросы.
__________________
Paul_ST |
|
18.03.2008, 14:25 | #2 |
Участник
|
Ну, тут, батенька, на себя только пенять, что не знаете, как работает exists join.
Здесь ошибки никакой нет. exists join для того и существует, чтобы уменьшить объем выбираемых данных. Его стоит использовать, когда нужны только данные первой таблицы. Если же нужны данные и из подчиненной таблицы, то используется обычный join. В плане соединения таблиц они ничем не отличаются. |
|
18.03.2008, 14:37 | #3 |
Участник
|
Спасибо за ответ!
Ещё раз внимательно прочитал Руководство разработчика. Там достаточно туманно , получается описывается exists join, равно как и outer. Я всегда , почему-то, считал, что exists join отличается от inner join'а тем, что вытаскиваются все записи главной таблицы и одна из соответствующих записей приджойненной (если есть таковая). А если нет соответствующей, то ничего из приджойненной не тянется. Однако, как мне казалось - запись из приджойненной таблицы в курсор подтягивается. Ан нет Натолкнулся на это только сейчас, поскольку до этого использовал курсоры - приджойненный через exists join исключительно для фильтрации. А сейчас захотел оттуда значения некоторых полей брать. Век живи, век учись!
__________________
Paul_ST |
|
19.03.2008, 11:23 | #4 |
----------------
|
Цитата:
Отличаются очень многим. Цитата:
Натолкнулся на это только сейчас, поскольку до этого использовал курсоры - приджойненный через exists join исключительно для фильтрации. А сейчас захотел оттуда значения некоторых полей брать.
Век живи, век учись! Все-таки надо хотя бы немного изучить обычный SQL, чтобы понимать, что же реально происходит с вашими данными. |
|
19.03.2008, 12:38 | #5 |
Участник
|
2 Wamr: А чем отличаются? Или имеется в виду, что отличаются тем, как непосредственно соединение их выполняется?
Потому что с точки зрения результата, как я вижу, ничем. В смысле, что получаем те же строки, как если бы использовали обычный join, но только из первой таблицы. Можно ответить ссылочкой - я люблю читать |
|
19.03.2008, 13:08 | #6 |
Участник
|
Цитата:
|
|
|
За это сообщение автора поблагодарили: kashperuk (5). |
19.03.2008, 13:35 | #7 |
Участник
|
А, ну да. Для 1:n действительно разница есть. Спасибо
А вот про подзапросы - я помню, что читал где-то, что после какого-то сервис пака подзапросы уже не создаются. Или на Оракле так и дальше создаются? На 4.0? |
|
20.03.2008, 23:07 | #8 |
Злыдни
|
Цитата:
На мой взгляд, главная опасность в использовании exists join - это получение непредсказуемого плана исполнения запроса. |
|
21.03.2008, 17:21 | #9 |
Developer
|
Так как же тогда "правильней" проверять наличие соответствующих записей в другой таблице? Inner Join c проверкой дубликатов? Отдельный запрос? Зачитывать заранее?
Такая обычная задачка, а в каждом конкретном случае оптимальная реализация может отличаться... Последний раз редактировалось vallys; 21.03.2008 в 17:25. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Проблемы с Exists Join | 28 | |||
Почему join запрос разбивается на подзапросы!? | 59 | |||
Проблема с Exists Join | 5 | |||
Как добавить к запросу еще один источник по EXISTS JOIN | 6 |
|