【问题标题】:How to update and insert with list of values in sql如何在sql中更新和插入值列表
【发布时间】:2013-08-29 09:38:36
【问题描述】:

我从选择查询中得到一个值列表。从列表中,我正在检查列表中的项目是否在表中可用。如果值存在,我需要更新值否则将列表插入表中。

使用列表,我可以在表中插入值列表。 如何在sql中检查和更新列表。

我的查询:

 WITH pq AS
    (
    SELECT A.[ProductId] ,A.[Quantity],A.[OrderId],D.[ProductName],E.[SpecialPrice],E.[SpecialPrice]*A.[Quantity] AS SPrice FROM [Table1]  A
    LEFT JOIN [Table2]  B ON A.[OrderId] = B.[OrderId] INNER JOIN [Table3]  D
    ON A.[ProductId] = D.[ProductId] INNER JOIN [Table4] E
    ON A.[ProductId] = E.[ProductId] WHERE B.[CustomerId] = 1       
    AND A.[OrderId] = 77 
    )
    IF (EXISTS(SELECT [ProductId] FROM [Table5] WHERE [ProductId] = A.[ProductId]))
    BEGIN
    UPDATE [Table5]
    SET [Quantity] = A.[Quantity]
    WHERE B.[CustomerId] = 1 AND [ProductId] = A.[ProductId]
    END
    ELSE
    BEGIN
    INSERT INTO [Table5]
    ([ProductId],[ProductName],[Quantity],[Price],[TotalAmount])
    SELECT
    [ProductId],[ProductName],[Quantity],[SpecialPrice],SPrice
    FROM pq;
    END

任何建议都会很有帮助。

编辑:选择查询结果

ProductId Quantity

   65       2

   64       1

【问题讨论】:

    标签: sql-server tsql sql-update sql-insert


    【解决方案1】:

    假设您使用的是 SQL Server 2008 或更高版本,MERGE 语句将解决您的问题:

    MERGE Table5 TRG
    USING (
        SELECT
            A.ProductId,
            A.Quantity,
            A.OrderId,
            D.ProductName,
            E.SpecialPrice,
            (E.SpecialPrice * A.Quantity) SPrice
        FROM Table1 A
            LEFT JOIN Table2 B ON A.OrderId = B.OrderId
            INNER JOIN Table3 D ON A.ProductId = D.ProductId
            INNER JOIN Table4 E ON A.ProductId = E.ProductId
        WHERE
            B.CustomerId = 1       
            AND A.OrderId = 77 
    ) SRC
    ON TRG.ProductID = SRC.ProductID
    WHEN MATCHED THEN
        UPDATE SET TRG.Quantity = SRC.Quantity
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (
            ProductId
            , ProductName
            , Quantity
            , Price
            , TotalAmount
        )
        VALUES (
            SRC.ProductId
            , SRC.ProductName
            , SRC.Quantity
            , SRC.SpecialPrice
            , SRC.SPrice)
    ;
    

    您可以将 SELECT 查询移出到 CTE 以便于阅读,就像您在示例中所做的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多