|
|
#1 |
|
Enjoy!
|
День добрый. Наткнулся на ранее не изведанную мною тему.
Начну с наглядного, есть Job, внутри запрос реализующий InnerJoin и OuterJoin. X++: QueryRun qr;
Query query = new Query();
QueryBuildDataSource qbdsEcoResProduct,
qcoEcoResProductDimensionGroupProduct,
qcoEcoResProductTranslation,
qbdsInventTable,
qbdsRetailAssortmentExploded;
RetailStoreTable _storeTable;
TransDate _effectiveDate = systemDateGet();
qbdsEcoResProduct = query.addDataSource(tableNum(EcoResProduct));
qbdsInventTable = qbdsEcoResProduct.addDataSource(tableNum(InventTable));
qbdsInventTable.joinMode(JoinMode::InnerJoin);
//qbdsInventTable.fetchMode(QueryFetchMode::One2One);
qbdsInventTable.addLink(fieldNum(EcoResProduct, RecId),
fieldNum(InventTable, Product),
qbdsEcoResProduct.name());
qbdsRetailAssortmentExploded = qbdsInventTable.addDataSource(tableNum(RetailAssortmentExploded));
qbdsRetailAssortmentExploded.joinMode(JoinMode::OuterJoin);
qbdsRetailAssortmentExploded.relations(true);
qbdsRetailAssortmentExploded.addRange(fieldNum(RetailAssortmentExploded, OMOperatingUnitId)).value(queryValue(_storeTable.OMOperatingUnitID));
// --> User: DBOwner
//qbdsRetailAssortmentExploded.addRange(fieldNum(RetailAssortmentExploded, ValidFrom)).value(queryRange(dateNull(), _effectiveDate));
//qbdsRetailAssortmentExploded.addRange(fieldNum(RetailAssortmentExploded, ValidTo)).value(queryRange(_effectiveDate, datemax()));
query.addQueryFilter(qbdsRetailAssortmentExploded, fieldStr(RetailAssortmentExploded, ValidFrom)).value(queryRange(dateNull(), systemDateGet()));
query.addQueryFilter(qbdsRetailAssortmentExploded, fieldStr(RetailAssortmentExploded, ValidTo)).value(queryRange(systemDateGet(), datemax()));
// <-- User: DBOwnerX++: SELECT * FROM EcoResProduct(EcoResProduct_1) JOIN * FROM InventTable(InventTable_1) ON EcoResProduct.RecId = InventTable.Product OUTER JOIN * FROM RetailAssortmentExploded(RetailAssortmentExploded_1) ON InventTable.ItemId = RetailAssortmentExploded.ItemId AND ((OMOperatingUnitId = 0)) AND ((ValidFrom<={ts '2014-07-09 00:00:00.000'})) AND ((ValidTo>={ts '2014-07-09 00:00:00.000'} AND ValidTo<={ts '2154-12-31 00:00:00.000'})) фильтра через класс QueryFilter то фильтры гарантированно уйдут после оператора WHERE: X++: SELECT * FROM EcoResProduct(EcoResProduct_1) JOIN * FROM InventTable(InventTable_1) ON EcoResProduct.RecId = InventTable.Product OUTER JOIN * FROM RetailAssortmentExploded(RetailAssortmentExploded_1) ON InventTable.ItemId = RetailAssortmentExploded.ItemId AND ((OMOperatingUnitId = 0)) WHERE ((RetailAssortmentExploded(RetailAssortmentExploded_1).ValidFrom<={ts '2014-07-09 00:00:00.000'})) AND ((RetailAssortmentExploded(RetailAssortmentExploded_1).ValidTo>={ts '2014-07-09 00:00:00.000'} AND ValidTo<={ts '2154-12-31 00:00:00.000'})) Для inner join никакой разницы между ними нет; для outer join записи, не удовлетворяющие условиям выражения ON, включаются в результирующую выборку, а записи, не удовлетворяющие условиям выражения where, не включаются. Использование QueryFilter гарантированно опускает условия выборки после WHERE. Вопрос: QueryRange правильнее использовать только при простых запросах и когда необходимо поместить в ON фиксированный ключ/релейшн? UPD: Буду благодарен за любую информацию на данную тему. Последний раз редактировалось iCloud; 09.07.2014 в 15:34. |
|
|
|
| За это сообщение автора поблагодарили: mazzy (5), Logger (3), S.Kuskov (5), Kabardian (2). | |
| Теги |
| ax2012, join, outer join, queryfilter, queryrange |
|
|
|