Microsoft Dynamics AX外部连接与等效SQL不同



i具有以下x 方法:

public void run()
{
    CustTable           ct;
    DirPartyTable       dir;
    DirAddressBookParty party;
    DirAddressBook      ab;
    int                 ctr = 0;
    ;  
     while
       select * from ct
         where ct.UT_AP_CustomerStatus == 1
       outer join * from dir
         where dir.RecId == ct.Party 
            && dir.Partition == ct.Partition
       outer join * from party
         where ct.Party == party.Party
       outer join * from ab
         where party.AddressBook == ab.RecId
            && ab.Name == ''
    {
        ctr++;
    }
    info(strFmt('Finished with %1 rows selected',ctr));
}

运行时,它总是返回2,346行,这是在Custtable中有多少行。但是,当我在SSMS中运行以下SQL时,它只会返回一行,就像它应该一样!

SELECT *
  FROM [DYNAMICS_AX].[dbo].[CUSTTABLE] ct
       LEFT OUTER JOIN [DYNAMICS_AX].[dbo].[DIRPARTYTABLE] dir
                    ON dir.RECID = ct.PARTY
                   AND dir.PARTITION = ct.PARTITION
       LEFT OUTER JOIN [DYNAMICS_AX].[dbo].[DIRADDRESSBOOKPARTY] party
                    ON ct.PARTY = party.PARTY
       LEFT OUTER JOIN [DYNAMICS_AX].[dbo].[DIRADDRESSBOOK] ab
                    ON party.ADDRESSBOOK = ab.RECID
 WHERE ct.UT_AP_CUSTOMERSTATUS = 1
   AND ab.NAME IS NULL

任何人都可以看到X 查询与我的SQL语句有什么问题?

谢谢craig

在您的所有伟大帮助/建议下,我意识到需要更改的内容。首先,我的SQL与Ab.name返回一排的原因是Null,是因为没有发现任何东西的左连接将无效的结果放入结果集中。那并向我展示了如何查找X 生成的SQL也确实有所帮助,我能够将X 更改为下面,以给我一个我想更新的一行:

while
     select ct
        where ct.UT_AP_CustomerStatus == 1
        notExists join party from party
        where ct.Party == party.Party

感谢您的帮助!

r x 和sql语句之间的差异在 ab.Name == ''ab.NAME IS NULL中。

另一个区别是,应在加入中写入条件...部分:

 LEFT OUTER JOIN [DYNAMICS_AX].[dbo].[DIRADDRESSBOOK] ab
   ON party.ADDRESSBOOK = ab.RECID
     AND ab.NAME = '' -- <-- ab.Name condition in JOIN part
 WHERE ct.UT_AP_CUSTOMERSTATUS = 1

您可以使用 Trace Parser 。。

另一个选择是使用generateOnly(仅开发/研究(:

select generateonly * from custTable;
info(custTable.getSQLStatement());

在斧头中,我希望您的查询会给您UT_AP_CustomerStatus == 1的客户。

ab.Name == ''不会更改计数,因为AX查询只需选择使用空白名称的DirAddressBook即可。它被翻译成SQL中的一个子句。如果您确实想使用外部Join 具有此范围,请转到子句的位置,则需要创建查询并使用查询过滤器,即使用AddQueryFilter。

不知道您真正想获得什么,但是您可以尝试使用普通的内部加入来剥离outer。另外,您永远不想在分区或dataareaid上选择系统。

格式考虑最佳实践:

public void run()
{
    CustTable           ct;
    DirPartyTable       dir;
    DirAddressBookParty party;
    DirAddressBook      ab;
    int                 ctr = 0;
    while select ct
        where ct.UT_AP_CustomerStatus == 1
        join RecId from dir
        where dir.RecId == ct.Party
        join RecId from party
        where ct.Party == party.Party
        join RecId from ab
        where ab.RecId == party.AddressBook
           && ab.Name == ''
    {
        ctr++;
    }
    info(strFmt('Finished with %1 rows selected',ctr));
}

最新更新