0

我正在阅读 Development 3 course 并且在某些时候,这个讨论已经到位 - 使用 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;
     }
4

1 回答 1

3

您不需要选择ItemId,因为您不会在 while 正文中使用它。

您的查询转换为 SQL:

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
;

这转化为

SELECT SUM(T1.QTY)
FROM INVENTTRANS T1
WHERE EXISTS
(
 SELECT 'x'
 FROM INVENTTABLE T2
 WHERE T2.ITEMID=T1.ITEMID
)
于 2016-01-15T12:35:18.063 回答