Вот нашел в Ax4.0 интересный глючок, и, как мне кажется, этого в 3ке не было, впрочем, меня поправят если что...
Если у какого-либо подчиненного QueryBuildDataSource в сложном запросе попросить его link (QueryBuildLink), а у того спросить relatedField(Table) и field(Table) (поле по которому связаны соотв. родительский и сам этот текущий datasource), то в качестве related (родительского поля/таблицы) будет возвращен текущий (т.е. подчиненный), а в качестве исходного - родительский.
В частности, это может служить объяснением, почему везде в SQL запросах (или их визуализации, т.е. при отладке, скажем, если посмотреть на FormBuildDatasource ) в условиях связки таблиц переставлены местами поля связок.
У меня Ax 4.0 клиент SP0 kernel 4.0.2163.0 на БД MS SQL Server версию не скажу

.
См. job.
X++:
static void testQueryBuildLink(Args _args)
{
Query q1;
QueryBuildDataSource qbds1, qbds2;
QueryBuildLink qbdl;
container qrPacked, RangePacked;
;
q1 = new Query();
qbds1 = q1.addDataSource(tablenum(InventTrans));
qbds2 = qbds1.addDataSource(tablenum(InventTable));
qbds2.relations(false);
qbdl = qbds2.addLink(fieldnum(InventTrans, ItemId), fieldnum(InventTable, ItemId));
info(strfmt("Связь - %1 %2", tableid2name(qbdl.table()), fieldid2name(qbdl.table(), qbdl.field())));
info(strfmt("к related %1 %2", tableid2name(qbdl.relatedTable()), fieldid2name(qbdl.Relatedtable(), qbdl.relatedField())));
}