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())); 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 |
|