使用查询 class 将多个 table 加入同一个 table

join multiple tables to the same table using query class

我正在使用查询 class 构建一个查询,该查询将有两个或三个 table 连接到相同的 table,如下所示:

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

在这个例子中,我试图加入 Table4 到 Table3 和 Table5 到 Table3 但它并不像我想要的那样工作;我已经检查了调试器,直到:

qbds5 = qbds3.addDataSource(tablenum(Table5))

一切正常;一旦执行此行,Table4 和 Table3 之间的连接就会消失,并且不会添加 Table5 和 Table3 之间的连接。发送到 SQL 服务器的查询实际上是 2 个查询,一个在 table1、table2 和 table3 之间,另一个在 table5 和 table6(link 到 table4 不存在)。如果我在最后执行 info (query.xml()),我会看到所有 table 之间的连接,就像我想要的那样。

是否可以使用查询 class 实现此目的?

如果您在一个join Level上有多个数据源,您需要将数据源的FetchMode设置为1:1(默认为1:n)。

在你的例子中,查询树看起来像

Table1
+ Table2
  + Table3
    + Table4
    + Table5
      + Table6

所以 Table4Table5 处于同一连接级别,需要 1:1 的 FetchMode。要为数据源设置 FetchMode,请使用类似于

的代码行
qbds2.fetchMode(QueryFetchMode::One2One);

有关其他信息,请参阅 Magical FetchMode property and See how the fetch and join modes in Microsoft Dynamics AX queries work

FH-Inway 答案正确:只需添加

qbdsX.fetchMode(QueryFetchMode::One2One);

对于同一级别的每个连接。