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