使用Fieldlist优化数据库通信

时间:2016-01-15 12:10:17

标签: axapta dynamics-ax-2012 dynamics-ax-2012-r3

我正在阅读开发3课程,并且在某些时候,这个讨论到位 - 使用fieldlist优化与数据库的通信。

例如:

while select AmountCurCredit from ledgerJournalTrans
{
    amountCurCredit += ledgerTrans.AmountCurCredit; 
}

我理解这一点,我们只选择AmountCurCredit字段而不选择其他字段。因此,如果我们尝试总结AmountCurDebit,那么我们将得到0。

好的,但是这个怎么样:

while select recId from inventTable
   join qty from inventTrans 
     where inventTrans.itemId == inventTable.itemId
     {  
         qty += inventTrans.qty;
     }

itemId不是select语句的一部分。它是如何获得价值的?是因为它被定义为InventTable和InventTrans表的索引吗?

我的意思是,我们不应该使用:

while select ItemId from inventTable
   join qty, ItemId from inventTrans 
     where inventTrans.ItemId == inventTable.ItemId
     {  
         qty += inventTrans.qty;
     }

1 个答案:

答案 0 :(得分:3)

您不需要选择containers,因为您不会在身体中使用它。

您的查询转换为SQL:

ItemId

更优化的声明将是:

SELECT InventTable.RecId
    , InventTrans.Qty 
FROM InventTable
    INNER JOIN InventTrans
        ON InventTrans.ItemId = InventTable.ItemId

转化为

while select qty from inventTrans 
    exists join recId 
    from inventTable
    where inventTable.ItemId == inventTrans.ItemId 
{  
    qty += inventTrans.qty;
}

更优化:

SELECT T1.QTY
FROM INVENTTRANS T1
WHERE EXISTS
(
 SELECT 'x'
 FROM INVENTTABLE T2
 WHERE T2.ITEMID=T1.ITEMID
)

转化为

select sum(Qty)
    from inventTrans 
    exists join recId 
    from inventTable
        where inventTable.ItemId == inventTrans.ItemId
;