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

时间:2018-06-25 12:56:30

标签: sql sql-server

我需要一种从子查询访问内部表中的列的方法,下面将其包含在数据库/表名称中,并进行了更改。内部查询返回具有特定术语config并属于特定客户的所有Item的Item_Id。显然,由于我无法从主查询访问create an account on a website x=1 while x <2 -> login and ask to be remembered -> delete the cookie do(); 的任何行,因此SET目前无法正常工作。

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

let

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

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

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'
                    )
            )

2 个答案:

答案 0 :(得分:2)

内部联接版本:

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'
        )

答案 1 :(得分:0)

合并是您的朋友https://docs.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