2016-09-03 22 views
1

我試圖更新表中的一列。目標是獲取當前值並從另一個表中減去該值。下面是我在看:更新聲明與從其他表中的子查詢

update LS 
    set LS.Quantity = (LS.Quantity - 
    ( 
     select top 1 LSM.Quantity 
     from tblLocationStockMovement LSM 
      join tblLocation L on L.ID=LSM.LocationID 
      join tblStock S on S.ID=LSM.StockID 
      join tblLocationStock LS on LS.StockID=LSM.StockID 
     where 
      LSM.StockID=LS.StockID 
      and MoveTypeID=16 
      and dateadd(DAY, DATEDIFF(day,0,DateCreated),0)='2016-08-30 00:00:00.00') 
    ) 

from tblLocationStock LS  
    join tblLocation L on L.ID=LS.LocationID 
    join tblStock S on S.ID=LS.StockID 
    join tblLocationStockMovement LSM on LS.StockID=LSM.StockID 

tblLocationStockMovement表中有我需要從tblLocationStock表減去值。他們都可以使用StockID加入tblStock。我希望它會減去兩個表中引用的相同股票的價值。現在它只是爲每個項目做相同的編號。

我可能不需要最後的join s,我只是用它來添加一個where來測試一個特定的項目,然後再對每個項目進行測試。你看到我要去哪裏嗎?

編輯:感謝大衛修復我的格式。我沒有用過這個網站,所以我不熟悉發佈內容的正確方法。

EDIT2:

所有你們三個有類似的想法,而奇怪的是,它有時作品

這裏就是我現在運行:

update LS 
    set LS.Quantity=(ISNULL(LS.Quantity,0)-ISNULL(LSM.Quantity,0)) 
     from tblLocationStock LS 
      join tblLocation L on L.ID=LS.LocationID 
      join tblStock S on S.ID=LS.StockID 
      join tblLocationStockMovement LSM on LSM.StockID=S.ID 
     where L.LongDescription='Cafe' 
      and MoveTypeID=2 
      and PLU = 715 

問題是結果的變化,我不知道爲什麼。

select LSM.Quantity 
from tblLocationStockMovement LSM 
    join tblLocation L on L.ID=LSM.LocationID 
    join tblStock S on S.ID=LSM.StockID 
where L.LongDescription='Cafe' 
    and PLU=715 
    and MoveTypeID=2 

總是導致120

select LS.Quantity 
    from tblLocationStock LS 
     join tblLocation L on L.ID=LS.LocationID 
     join tblStock S on S.ID=LS.StockID 
    where L.LongDescription='Cafe' 
     and PLU = 715 

總是導致53.因此,您所期待的更新語句的結果總是導致-67。有時候,但有時我會得到5,-43或29.答案有什麼不同?

回答

-1

試試這個:

update LS 
set LS.Quantity=LS.Quantity-LSM.Quantity 
from tblLocationStock LS 
    join tblLocation L on L.ID=LS.LocationID 
    join tblStock S on S.ID=LS.StockID 
    join tblLocationStockMovement LSM on LS.StockID=LSM.StockID 
where LSM.movetypeid=16 
    and LSM.datecreated = '08/30/2016' 
0

你也可以試試這個:

UPDATE LS 
    SET LS.Quantity = (LS.Quantity-LSM.Quantity) 
FROM tblLocationStockMovement LSM 
JOIN tblLocation L ON L.ID=LSM.LocationID 
JOIN tblStock S ON S.ID=LSM.StockID 
JOIN tblLocationStock LS ON LS.StockID=LSM.StockID 
WHERE LSM.StockID=LS.StockID 
    AND MoveTypeID=16 
    AND dateadd(DAY, DATEDIFF(DAY,0,DateCreated),0)='2016-08-30 00:00:00.00') 
0

試試這個:

update LS 
    set LS.Quantity = ISNULL(LS.Quantity,0) - ISNULL(LSM.Quantity,0) 
from tblLocationStock LS  
join tblLocation L on L.ID=LS.LocationID 
join tblStock S on S.ID=LS.StockID 
join tblLocationStockMovement LSM on LS.StockID=LSM.StockID 
    and MoveTypeID=16 
    and dateadd(DAY, DATEDIFF(day,0,DateCreated),0)='2016-08-30 00:00:00.00'