Sql server Update语句包含来自另一个表的子查询
我正在尝试更新表中的一列。目标是获取当前值并从其他表中减去该值。以下是我所看到的:Sql server Update语句包含来自另一个表的子查询,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我正在尝试更新表中的一列。目标是获取当前值并从其他表中减去该值。以下是我所看到的: update LS set LS.Quantity = (LS.Quantity - ( select top 1 LSM.Quantity from tblLocationStockMovement LSM join tblLocation L on L.ID=LSM.LocationID join tb
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
tbllocationstockmove
表中有我需要从tblLocationStock
表中减去的值。它们都可以使用StockID
连接到tblStock
。我希望它能减去两个表中引用的同一只股票的价值。现在它只是对每一个项目做相同的编号
我可能不需要最后的join
s,我只是用它来添加一个where
来测试一个特定的项目,然后再对每个项目进行测试。你知道我哪里做错了吗
编辑:谢谢David修改了我的格式。我没有经常使用这个网站,所以我不太熟悉发布东西的正确方式
编辑2:
你们三个都有一个相似的想法,奇怪的是它有时会起作用
以下是我正在运行的内容:
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。因此,您希望update语句的结果始终是-67。有时会,但有时我会得到5,-43或29。答案会有不同的原因吗?试试这个:
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'
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'
您也可以尝试以下方法:
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')
试试这个:
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'
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'