2012-11-13 63 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

非常有趣的帖子。有時我應該使用跟蹤記錄器,並真正檢查我認爲的查詢成本。 –