|  25.02.2005, 15:32 | #1 | 
| aka awas |  2 и более OUTER JOIN к одному паренту 
			
			Доброго времени суток, вам, господа и дамы! Не подскажите, как построить селект с 2мя и более outer join'ами с одним парентом? Или объяснить мне в чем я не прав. У меня на последнем Join'e ругается что "Невозможно выбрать запись в 'Условия оплаты' ('PaymTerm') Использован оператор объединения таблиц join, но выражение WHERE не содержит связи между таблицами." static void Job10(Args _args) { SalesTable contractTable; EmplTable emplTable; PaymTerm paymTerm; ; while select SalesName from contractTable outer join NumOfDays, Description from paymTerm where paymTerm.PaymTermId == contractTable.Payment outer join Name from emplTable where emplTable.EmplId == contractTable.SalesResponsible { info(strfmt("%1 %2", paymTerm.NumOfDays, contractTable.SalesName)); } } Хинт: с "обыкновенными", inner join'ами, все job запускается... | 
|  | 
|  25.02.2005, 15:37 | #2 | 
| Роман Долгополов (RDOL) | 
			
			Это глюк ядра, а точнее парсера запросов. В сервисную систему регистрировал, когда исправят не знаю. хинт: если не хотите ждать, то используйте в качестве СУБД Oracle      - парсер запросов для него отрабатывает корректно | 
|  | 
|  25.02.2005, 20:32 | #3 | 
| Участник | Цитата: 
		
			Изначально опубликовано db  хинт: если не хотите ждать, то используйте... | 
|  | 
|  28.02.2005, 10:11 | #4 | 
| aka awas | 
			
			Спасибо всем за ответ! db: на счет Oracle - узнать это было интересно, особенно в конетксте наличия подводных камней при переносе базы с одной платформы на другую. Mazzy: с помощью query задача и решилась, причем еще до написания поста. Просто этот случай своей нелепостью вызывал уже чисто академический интерес: как можно в конструкции select сделать более 1го outer join, и если нельзя, то почему. Ответы я похоже получил исчерпывающие. Спасибо. :-) | 
|  | 
|  28.02.2005, 11:28 | #5 | 
| Участник | 
			
			awas, в ФАК этот ответ заносить стоит?
		 | 
|  | 
|  28.02.2005, 15:47 | #6 | 
| aka awas | 
			
			ИМХО: однозначно.
		 | 
|  | 
|  28.02.2005, 17:27 | #7 | 
| Участник | |
|  | 
|  28.02.2005, 17:50 | #8 | 
| ---------------- | Цитата: 
		
			Или query
		
	 PHP код: 
			Использован оператор объединения таблиц join, но выражение WHERE не содержит связи между таблицами. | 
|  | 
|  28.02.2005, 19:37 | #9 | 
| aka awas | 
			
			Еще в копилку. Немного интересного обнаружил при анализе одного запроса с помощью профайлера. Запрос имеет примерно следующую структуру: select Table_1 inner join Table_2 outer join Table_2_1 outer join Table _2_1_1 outer join Table_2_2 outer join Table_2_2_1 Аксапта этот запрос разбила на 3... Этот выполнялся соответственно 1 раз select Table_1 join Table_2 Эти части выполнялись соответственно столько раз, сколько записей вернулось при 1 запросе... select Table_2_1 outer join Table _2_1_1 select join Table_2_2 outer join Table_2_2_1 При этом на n-ой записи метод queryRun.next() выдает ошибку типа: "Невозможно выбрать запись в 'Table_2_2_1' ('Table_2_2_1') Из базы данных выбрано нулевое значение (NULL), которое не поддерживается." | 
|  | 
|  20.07.2005, 17:16 | #10 | 
| Участник | 
			
			С помощью query задача решается не корректно. Пример запроса: Таблица 1 outer joun Таблица 2 outer joun Таблица 3 В таблице 1 - 1-а запись В таблице 2 - 0 - записей В таблице 3 - 1-а запись связанная с таблицей 1 Цикл по такому запросу сделает 2 итерации: на 1-ой: Таблица 1 инициализирована Таблица 2 не инициализирована(оно и понятно в ней нет записей) Таблица 3 не инициализирована(!!!) на 2-ой: Таблица 1 инициализирована Таблица 2 не инициализирована(оно и понятно в ней нет записей) Таблица 3 инициализирована Проект в приатацином файле. Пока только один вариант решения, разбивать запрос на 2. | 
|  | 
|  25.07.2005, 18:09 | #11 | 
| Developer |  Есть предложение 
			
			Строить такие запросы (2 и более OUTER JOIN к одному паренту) на Х++ для таблиц со свойством "SaveDataPerCompany" == "Yes" можно путем добавления фиктивной связи между дочерними таблицами по полю DataAreaId: PHP код: 
			PHP код: 
			Аналогично для Query, если у вложенных датасоурсов свойство "FetchMode" == "1:1". | 
|  | |
| За это сообщение автора поблагодарили: bagyr (1), alex55 (1), S.Kuskov (4). | |
|  25.07.2005, 20:16 | #12 | 
| Участник | Цитата: 
		
			Вот это я не понял...
		
	 Я решил эту проблему qbDS2.relations(false); qbDS2.addLink(fieldNum(InventSum, InventDimId), fieldNum(InventDim, InventDimId)) т.е. явным прописыванием связи между таблицами... | 
|  | 
|  18.12.2005, 19:22 | #13 | 
| Участник | Цитата: 
		
			Сообщение от vallys
			
			 Аналогично для Query, если у вложенных датасоурсов свойство "FetchMode" == "1:1".   | 
|  | 
|  18.12.2005, 19:36 | #14 | 
| Участник | Цитата: 
		
			Сообщение от Logger
			
			 Wamr, я недавно тоже столкнулся с подобным поведением автоджоина. Причем глючило только в случае если на InventDim  не было ни одного Range. Стоило добавить хоть один range как все работало хорошо. Я решил эту проблему qbDS2.relations(false); qbDS2.addLink(fieldNum(InventSum, InventDimId), fieldNum(InventDim, InventDimId)) т.е. явным прописыванием связи между таблицами... И к awas вопрос - как ему совет mazzy помог? Я тоже посмотрел те картинки, но решения проблемы оттуда не увидел. Может у вас просто query на автомате создался со свойстовом "FetchMode" == "1:n" на датасорсе и дело двинулось по другому пути? но исходная проблема не решилась? | 
|  | 
|  18.12.2005, 20:09 | #15 | 
| Участник | 
			
			Попробуйте так X++: qbDS2.relations(false); qbDS2.addRange(fieldNum(InventDim, InventDimId)). value(strfmt("(((%2.dataAreaId == %3.DataAreaId) || (%2.dataAreaId != %3.DataAreaId)) && " + "(%1.inventDimId == %3.inventDimId))", qbDS1.name(), q.dataSourceTable(tableNum(InventTable)).name(), qbDS2.name())); 
				__________________ Axapta v.3.0 sp5 kr2 | 
|  | 
|  19.12.2005, 07:38 | #16 | 
| Участник | Цитата: 
		
			Сообщение от AndyD
			
			 Попробуйте так X++: qbDS2.relations(false); qbDS2.addRange(fieldNum(InventDim, InventDimId)). value(strfmt("(((%2.dataAreaId == %3.DataAreaId) || (%2.dataAreaId != %3.DataAreaId)) && " + "(%1.inventDimId == %3.inventDimId))", qbDS1.name(), q.dataSourceTable(tableNum(InventTable)).name(), qbDS2.name()));  тоже самое, но наивно решил не заморачиваться с strfmt() в тесте своем и вбивал сразу же условие текстом X++: qbDS2.addRange(fieldNum(InventDim, InventDimId)). value("(((InventTable.dataAreaId == InventDim.DataAreaId) || (InventTable.dataAreaId != InventDim.DataAreaId)) && (InventSum.inventDimId == InventDim.inventDimId))"); Не ошибайтесь так люди   | 
|  | 
|  19.12.2005, 08:16 | #17 | 
| Участник | 
			
			Можно было явно дать название датасоурсам qbDS1 = q.addDataSource(tableNum(InventSum), "InventSum"); или qbDS1.Name("InventSum"); и т.д. Тогда бы ваш вариант работал. 
				__________________ Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 19.12.2005 в 09:08. | 
|  | 
|  19.12.2005, 10:27 | #18 | 
| ---------------- | 
			
			Хочу отметить, что Job40 (см. тут ) замечательно работает на Oracle и никак не работает на MS SQL.
		 | 
|  | 
|  19.12.2005, 13:21 | #19 | 
| Developer | Цитата: 
		
			Сообщение от Wamr
			
			 Хочу отметить, что Job40 (см. тут ) замечательно работает на Oracle и никак не работает на MS SQL. Код: qbDS2.addRange(fieldnum(InventDim, DataAreaId)).value(strfmt(
        "((%1.DataAreaId == %2.DataAreaId) || (%1.DataAreaId != %2.DataAreaId))",
        qbDS2.name(),
        q.dataSourceTable(tablenum(InventTable)).name()
        )); | 
|  | 
|  19.12.2005, 13:29 | #20 | 
| ---------------- | 
			
			а включаешь PHP код: 
			Наверно, это из-за SaveDataPerCompany = NO Последний раз редактировалось Wamr; 19.12.2005 в 13:36. | 
|  | 
|  | 
|  Похожие темы | ||||
| Тема | Ответов | |||
| Двойной Outer Join в Query | 2 | |||
| Несколько outer join в запросе | 2 | |||
| Данные в Grid из таблиц, связанных по Outer Join | 2 | |||
| Outer Join | 3 | |||
| outer join для трех таблиц | 4 | |||
| 
 |