需要从主更新查询中的子查询访问表



我需要一种方法来从子查询访问内部表中的列,我在下面包含更改了数据库/表名称。内部查询返回具有特定术语配置且属于特定客户的 Items 的所有Item_Ids。显然,SET 目前不起作用,因为我无法访问主查询中的任何let行。

我对 SQL 相当陌生,并且正在努力思考如何将其转换为使用连接而不是子查询。问题是我需要能够为来自子查询的任何Item_Ids设置所有总计。

UPDATE [Database].[dbo].[Items]
SET GrandTotal = GrandTotal / let.CurrentValue
WHERE Id IN (
SELECT let.Item_Id
FROM [Database].[dbo].[ItemTerms] let
WHERE TermConfig_Id = 'TERM_CONFIG_ID'
AND Item_Id IN (
SELECT le2.Id
FROM [Database].[dbo].[LaneExhibits] le2
WHERE Customer_Id = 'CUST_ID'
)
)

编辑:从子查询添加示例行

列包括 Id、DataValueStatus、CurrentValue、PreviousValue、Item_Id TermConfig_Id。子查询仅返回Item_Id但这是其余数据。

424C8BF4-0FCB-E711-80C9-005056BA0972    1   460 NULL    2D4C8BF4-0FCB-E711-80C9-005056BA0972    B8FCE730-27BE-E711-80C9-005056BA0972

内部连接版本:

UPDATE i
SET GrandTotal = GrandTotal / let.CurrentValue
FROM [Database].[dbo].[Items] i
INNER JOIN [Database].[dbo].[ItemTerms] let ON i.Id=let.Item_Id
WHERE TermConfig_Id = 'TERM_CONFIG_ID'
AND Item_Id IN (
SELECT le2.Id
FROM [Database].[dbo].[LaneExhibits] le2
WHERE Customer_Id = 'CUST_ID'
)

Merge是你的朋友 https://learn.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-2017

示例中的简化示例

MERGE [Database].[dbo].[Items] AS target  
USING (SELECT let.Item_Id, let.CurrentValue FROM [Database].[dbo].[ItemTerms] let 
/* other joins and filters here */
) AS source (Item_Id, CurrentValue)  
ON (target.Item_Id = source.id /* or what you want */)  
WHEN MATCHED THEN   
UPDATE SET GrandTotal = source.GrandTotal / source.CurrentValue 

最新更新