如何在sql中更新和插入值列表

时间:2013-08-29 09:38:37

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

我从select查询中获取值列表。从列表中,我正在检查表中的项目是否可用。如果值存在,我需要更新值,否则将列表插入表中。

通过列表,我可以在表格中插入值列表。 如何在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

1 个答案:

答案 0 :(得分:2)

假设您使用的是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以获取易读性。