2012-11-13 34 views
0

为什么其中一个查询可以工作而另一个却不工作?我编写了正在运行的查询,然后将该表临时创建,并且必须将其重写为在外部具有临时表。在查询中混合使用临时表和实际表

这是表中的数据:

tmpTASItemQtyInventDim:

 
|ItemId | InventDimId | InventQty | 
|-------|--------------|-----------| 
|73016 | Dim 11542913 | 0   | 

SalesLine:

 
|Sales Id |Line No | ItemId | InventDimId | SalesQty | 
|------------|--------|--------|--------------|-----------| 
|SO120036796 |  1| 73016 | Dim 11542913 | 2   | 

不起作用:

select firstonly tmpTASItemQtyInventDim 
    join itemId, InventDimId, sum(salesQty) from salesLine 
    group by itemId, InventDimId 
    where salesLine.SalesId == 'SO120036796' && 
      tmpTASItemQtyInventDim.ItemId == salesLine.ItemId  && 
      tmpTASItemQtyInventDim.InventDimId == salesLine.InventDimId && 
      tmpTASItemQtyInventDim.InventQty  < salesLine.SalesQty; 

if (tmpTASItemQtyInventDim.ItemId) 
    info("Insufficient Qty"); 
else 
    info("Good qty"); 

作品:

select firstonly itemId, InventDimId, sum(salesQty) from salesLine 
    group by itemId, InventDimId 
    where salesLine.SalesId  == 'SO120036796' 
    exists join tmpTASItemQtyInventDim 
     where tmpTASItemQtyInventDim.ItemId == salesLine.ItemId  && 
       tmpTASItemQtyInventDim.InventDimId == salesLine.InventDimId && 
       tmpTASItemQtyInventDim.InventQty  < salesLine.SalesQty; 

if (salesLine.ItemId) 
    info("Insufficient Qty"); 
else 
    info("Good Qty"); 

双方应输出Insufficient Qty,而是先说Good Qty

回答

1

从内存我认为你需要按在第一个表以及 看到 http://axatluegisdorf.blogspot.co.uk/2010/07/select-group-by-and-join-order-by.html

select firstonly ITEMID,InventDimId 
    FROM tmpTASItemQtyInventDim 
    GROUP BY ITEMID,InventDimId 
join itemId, InventDimId, sum(salesQty) 
from salesLine 
group by itemId, InventDimId 
where salesLine.SalesId == 'SO120036796' && 
     tmpTASItemQtyInventDim.ItemId == salesLine.ItemId  && 
     tmpTASItemQtyInventDim.InventDimId == salesLine.InventDimId && 
     tmpTASItemQtyInventDim.InventQty  < salesLine.SalesQty; 

if (tmpTASItemQtyInventDim.ItemId) 
    info("Insufficient Qty"); 
else 
    info("Good qty"); 
+0

太棒了!没有完全理解为什么我需要这样做,但它的工作原理。 –

+0

我认为它是因为没有group by的查询等同于'code'从tmpTASItemQtyInventDim选择SalesLine.ItemId,SalesLine.InventDimId内部加入salesLine ON tmpTASItemQtyInventDim.ItemId == salesLine.ItemId和 tmpTASItemQtyInventDim.InventDimId == salesLine.InventDimId。 ...'代码'如果“你的工作不正常”测试SalesLine.ItemId它认为会产生正确的结果 –

1

混合临时表和真实的表像骑自行车一个鹅卵石路。你并不总是得到你想得到的东西,以及performance sometimes sucks

在AX 2012中,您可以使用工作更可预测的TempDB。请参阅Axaptapedia

+0

非常有趣的帖子。有时我应该使用跟踪记录器,并真正检查我认为的查询成本。 –