04.12.2008, 15:05 | #1 |
Участник
|
Вопрос про Outer Join
Добрый день.
Прошу прощения за легкий вопрос.. Объявления опустим.. Пишу такой запрос: //выбираю все ItemId из InventTable qbDSItem = query.addDataSource(tableNum(InventTable)); qbDSItem.addSortField(fieldNum(InventTable, ItemId)); qbDSItem.orderMode(OrderMode::GroupBy); qbDSItem.addSelectionField(fieldNum(InventTable, ItemId)); //добавляю таблицу InventTrans qbDS = qbDSItem.addDataSource(tableNum(InventTrans)); qbDS.joinMode(JoinMode::OuterJoin); qbDS.addLink(fieldNum(InventTable, ItemId), fieldNum(InventTrans, ItemId)); qbDS.addSortField(fieldNum(InventTrans, ItemId)); qbDS.addSelectionField(fieldNum(InventTrans, ItemId)); //вывожу результат queryRun = new QueryRun(query); while (queryRun.next()) { inventTable = queryRun.get(tableNum(InventTable)); inventTrans = queryRun.get(tableNum(InventTrans)); info( strfmt( "%1 %2", inventTable.ItemId, inventTrans.ItemId)); } Вот пример того, что выводится: 0001 0001 0001 0002 0002 0002 0003 //номера 0003 нет в TransTable 0004 0004 0004 Почему выводятся строки типа 0001 0001 0001 Вместо 0001 0001 ? |
|
04.12.2008, 15:10 | #2 |
Участник
|
А если попробовать добавить qbDS.fetchMode(QueryFetchMode::OneToOne) перед queryRUn?
|
|
|
За это сообщение автора поблагодарили: Silphidae (1). |
04.12.2008, 15:16 | #3 |
Участник
|
Потому что нужно добавить условие типа
if (queryRun.changed(tableNum(InventTrans)) перед info Кстати, вот это qbDS.addSortField(fieldNum(InventTrans, ItemId)); qbDS.addSelectionField(fieldNum(InventTrans, ItemId)); на мой взгляд лишнее, поскольку и так уже указана сортировка по этому полю выше по тексту и выбираться оно будет в любом случае, поскольку по нему связь Последний раз редактировалось coolibin; 04.12.2008 в 15:31. |
|
04.12.2008, 15:28 | #4 |
Участник
|
Добавление qbDS.fetchMode(QueryFetchMode::OneToOne) вызывает ошибку в запросе
"Невозможно выбрать запись в Складские операции (InventTrans). Использован оператор объединения таблиц join, но выражение WHERE не содержит связи между таблицами." Надо думать, он не может связать таблицы по полю ItemId, т.к. не всегда есть ItemId в InventTrans такой же как InventTable. |
|
04.12.2008, 15:34 | #5 |
Участник
|
Вот так у меня работает
X++: qbDSItem = query.addDataSource(tableNum(InventTable)); qbDSItem.addSortField(fieldNum(InventTable, ItemId)); qbDSItem.orderMode(OrderMode::GroupBy); qbDSItem.addSelectionField(fieldNum(InventTable, ItemId)); //добавляю таблицу InventTrans qbDS = qbDSItem.addDataSource(tableNum(InventTrans)); qbDS.joinMode(JoinMode::OuterJoin); qbDS.addLink(fieldNum(InventTable, ItemId), fieldNum(InventTrans, ItemId)); //вывожу результат queryRun = new QueryRun(query); while (queryRun.next()) { inventTable = queryRun.get(tableNum(InventTable)); inventTrans = queryRun.get(tableNum(InventTrans)); if (queryRun.changed(tableNum(InventTrans))) { info( strfmt( "%1 %2", inventTable.ItemId, inventTrans.ItemId)); } } |
|
|
За это сообщение автора поблагодарили: evv (1), Silphidae (1). |
04.12.2008, 15:42 | #6 |
Участник
|
Вариант, предложенный coolibin, действительно работает, спасибо.
Но тогда не выводятся уникальные ItemId, которые есть в InventTable, но которых нет в InventTrans. В моем примере это был ItemId == 0003 Можно с помощью if-оф добиться вывода нужной информации. Но, хотелось бы, чтобы сам запрос не содержал дублей. Последний раз редактировалось Silphidae; 04.12.2008 в 15:53. |
|
04.12.2008, 15:53 | #7 |
Участник
|
Ааа, так нужны уникальные...
тогда if (queryRun.changed(tableNum(InventTrans))) заменить на if (queryRun.changed(tableNum(InventTable))) |
|
04.12.2008, 16:04 | #8 |
Участник
|
Кхм...попробовал, у меня на трешке не выдает дублей никаких, и даже без changed()
X++: qbDSItem = query.addDataSource(tableNum(InventTable)); qbDSItem.addSortField(fieldNum(InventTable, ItemId)); qbDSItem.orderMode(OrderMode::GroupBy); qbDSItem.addSelectionField(fieldNum(InventTable, ItemId)); //добавляю таблицу InventTrans qbDS = qbDSItem.addDataSource(tableNum(InventTrans)); qbDS.joinMode(JoinMode::OuterJoin); qbDS.addLink(fieldNum(InventTable, ItemId), fieldNum(InventTrans, ItemId)); qbDS.addSortField(fieldNum(InventTrans, ItemId)); qbDS.orderMode(OrderMode::GroupBy); //вывожу результат queryRun = new QueryRun(query); while (queryRun.next()) { inventTable = queryRun.get(tableNum(InventTable)); inventTrans = queryRun.get(tableNum(InventTrans)); //if (queryRun.changed(tablenum(InventTable))) info( strfmt( "%1 %2", inventTable.ItemId, inventTrans.ItemId)); } Последний раз редактировалось coolibin; 04.12.2008 в 16:09. |
|
04.12.2008, 16:09 | #9 |
Участник
|
Прошу прощения.. В моем коде был еще один Inner Join перед Outer, когда я его убрал, дубли исчезли.
Хех. В связи с этим возник вопрос.. Как с этим бороться, ибо Inner Join мне нужен. Модель датасорса выглядит так: qbDSItem по InventTable qbDSChild по InventItemGroup связь с Inner Join qbDSItem по полю InventGroupId qbDS по InventTrans связь с Outer Join qbDSItem по полю ItemId Может, я неправильно строю соединения? Последний раз редактировалось Silphidae; 04.12.2008 в 16:23. |
|
04.12.2008, 16:25 | #10 |
Участник
|
fetchMode указывайте, как я советывал выше
|
|
05.12.2008, 14:01 | #11 |
Участник
|
В тему про запросы..
Пишу датасорс qbDSItem к нему по Inner Join добавляю qbDSChild, затем по Outer Join добавляю qbDS. Вывожу запрос в info(qbDSItem.toString()).. Никакого Outer Joina там нет!!! Если к qbDSItem по Outer Join сразу добавлять qbDS (без qbDSChild), то в инфо выводится запрос с Outer Join. Я чего-то не понимаю.. Помогите, пожалуйста. |
|
05.12.2008, 14:07 | #12 |
MCTS
|
Примеры хоть кода приведите
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
05.12.2008, 15:11 | #13 |
MCITP
|
Цитата:
Сообщение от Silphidae
В тему про запросы..
Пишу датасорс qbDSItem к нему по Inner Join добавляю qbDSChild, затем по Outer Join добавляю qbDS. Вывожу запрос в info(qbDSItem.toString()).. Никакого Outer Joina там нет!!! Если к qbDSItem по Outer Join сразу добавлять qbDS (без qbDSChild), то в инфо выводится запрос с Outer Join. Я чего-то не понимаю.. Помогите, пожалуйста.
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: Silphidae (1). |
05.12.2008, 16:28 | #14 |
Участник
|
Спасибо за ответы.
|
|
Теги |
join, outer join, query |
|
Похожие темы | ||||
Тема | Ответов | |||
Несколько outer join в запросе | 2 | |||
Данные в Grid из таблиц, связанных по Outer Join | 2 | |||
2 и более OUTER JOIN к одному паренту | 21 | |||
Outer Join | 3 | |||
outer join для трех таблиц | 4 |
|