我正在使用查询类来构建一个查询,该查询将有两个或三个表连接到同一个表,如下所示:
qbds1 = query.addDataSource(tablenum(Table1));
qbds2 = qbds1.addDataSource(tablenum(Table2));
qbds2.relations(true);
qbds3 = qbds2.addDataSource(tablenum(Table3));
qbds3.relations(true);
qbds4 = qbds3.addDataSource(tablenum(Table4));
qbds4.relations(true);
qbds5 = qbds3.addDataSource(tablenum(Table5));
qbds5.relations(true);
qbds6 = qbds5.addDataSource(tablenum(Table6));
qbds6.relations(true);
qbds6.joinMode(JoinMode::ExistsJoin);
在此示例中,我尝试将表 4 连接到表 3 ,将表 5 连接到表 3 但它不像我想要的那样工作;我已经使用调试器检查并直到:
qbds5 = qbds3.addDataSource(tablenum(Table5))
外翻是可以的;一旦执行此行,Table4和Table3之间的连接就会消失,并且不会添加Table5和Table3之间的连接。发送到SQL服务器的查询实际上是2个查询,一个在table1,table2和table3之间,另一个在table5和table6之间(table4的链接不存在)。如果我在最后执行info(query.xml()),我会看到所有表之间的连接,就像我想要的那样。
甚至可以使用查询类实现此目的吗?
答案 0 :(得分:2)
如果连接级别上有多个数据源,则需要将数据源的FetchMode
设置为1:1(默认值为1:n)。
在您的情况下,查询树看起来像
Table1
+ Table2
+ Table3
+ Table4
+ Table5
+ Table6
因此Table4
和Table5
位于同一个加入级别,需要FetchMode
为1:1。要为数据源设置FetchMode
,请使用类似于
qbds2.fetchMode(QueryFetchMode::One2One);
有关其他信息,请参阅Magical FetchMode property和See how the fetch and join modes in Microsoft Dynamics AX queries work。
答案 1 :(得分:1)
FH-Inway回答是正确的:只需添加
qbdsX.fetchMode(QueryFetchMode::One2One);
对于同一级别的每个联接。