|  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 | |||
| 
 |