SQL Server:使用case插入两个表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server:使用case插入两个表相关的知识,希望对你有一定的参考价值。

我有两张桌子

  1. PriceMst
  2. ProductMst

当插入数据到ProductMst时,代码只插入一个值,但在PriceMst有一个条件,如果价格> 300,它将插入一公斤,750克,500克,250克各自根据重量计算价格为1公斤,750克,500克,250克,如果价格<300,它应该只插入一次。

并在PriceMst生成一些id,主要Productcode例如。 FP-001并生成类似FP-001-01的PriceCode。

我的表格描述是

tblProduct

   ProductCode  ProductName ProductPrize    ProductSizeID
   ------------------------------------------------------
    FP-001          ABC         200.00          4
    FP-002          PQW         500.00          3
    FP-003          ASD        1200.00          4

tblPriceMST

ProductCode ProductPriceID  ProductPrize    ProductSize  ProductUnit
----------------------------------------------------------------------
 FP-001         FP-001-05    200.00           1             KG
 FP-002         FP-002-01    500.00           1             KG
 FP-002         FP-002-02    375.00         750             GMS
 FP-002         FP-002-03    250.00         500             GMS
 FP-002         FP-002-04    125.00         250             GMS
 FP-003         FP-003-01   1200.00           1             KG
 FP-003         FP-003-02    900.00         750             GMS
 FP-003         FP-003-03    600.00         500             GMS
 FP-003         FP-003-04    300.00         250             GMS

请指导我如何在单个查询中插入两个表。

此查询将用于我的存储过程。

答案

你需要做一些事情来完成这项工作。对于存储过程的第一部分,您需要插入到tblProduct表中,然后将新的ProductCode存储在变量中。我假设ProductCode是通过触发器或计算列生成的。如果您没有自动生成,最好的方法是通过creating a computed column

下面使用ProductName和ProductPrice作为参数创建过程,将它们插入到tblProduct中,并将新的ProductCode存储到@NewProductCode临时表中。

CREATE PROCEDURE dbo.InsertProduct @ProductName nvarchar(255), @ProductPrice decimal(19,4)
AS
    DECLARE @NewProductCodeTempTable table (ID int)

    INSERT INTO tblProduct (ProductName, ProductPrize) 
    OUTPUT INTO INSERTED.ProductCode @NewProductCode
    VALUES (@ProductName, @ProductPrice)

接下来,您将使用IF / ELSE语句来确定是否需要在tblPriceMST表中插入一条或四条记录。

    DECLARE @NewProductCode = SELECT ID FROM @NewProductCodeTempTable

    IF (@ProductPrice < 300)   
        INSERT INTO tblPriceMST (ProductCode, ProductPriceID, ProductPrize,    ProductSize, ProductUnit)
        VALUES (@NewProductCode, @NewProductCode + '-01', @ProductPrice, 1, 'KG')
    ELSE 
    BEGIN
        INSERT INTO tblPriceMST (ProductCode, ProductPriceID, ProductPrize,    ProductSize, ProductUnit)
        VALUES (@NewProductCode, @NewProductCode + '-01', @ProductPrice, 1, 'KG')

        INSERT INTO tblPriceMST (ProductCode, ProductPriceID, ProductPrize,    ProductSize, ProductUnit)
        VALUES (@NewProductCode, @NewProductCode + '-02', @ProductPrice*.75, 750, 'GMS')   

        INSERT INTO tblPriceMST (ProductCode, ProductPriceID, ProductPrize,    ProductSize, ProductUnit)
        VALUES (@NewProductCode, @NewProductCode + '-03', @ProductPrice*.5, 500, 'GMS')  

        INSERT INTO tblPriceMST (ProductCode, ProductPriceID, ProductPrize,    ProductSize, ProductUnit)
        VALUES (@NewProductCode, @NewProductCode + '-04', @ProductPrice*.25, 250, 'GMS')            
    END
GO

如果价格> 300,我已经推断出为不同产品权重插入记录的规则。但是如果你有更多的规则,你可以在ELSE块中添加额外的IF / THEN或CASE语句。

如果您简化表格设计但是在不了解所有要求的情况下很难说它应该是什么样子,那么可能有一种更容易的方法。

另一答案

首先,您的ProductSizeID似乎被忽略了 - 这是预期的行为吗?它没有在tblPriceMST中使用......

但是,如果你总是只需要1 KG单位的奖金ID为所有价格<300,并且所有价格> = 300的1 KG到250 G的奖金ID为2 - 4,你可以简单地使用UNION ALL:

SELECT ProductCode, ProductCode+'-01' AS ProductPriceID, ProductPrize, 1 ProductSize, 'KG' ProductUnit
  FROM tblProduct
  WHERE ProductPrize < 300
UNION ALL
SELECT ProductCode, ProductCode+'-01' AS ProductPriceID, ProductPrize, 1 ProductSize, 'KG' ProductUnit
  FROM tblProduct
  WHERE ProductPrize >= 300
UNION ALL
SELECT ProductCode, ProductCode+'-02' AS ProductPriceID, ProductPrize*0.75, 750 ProductSize, 'G' ProductUnit
  FROM tblProduct
  WHERE ProductPrize >= 300
UNION ALL
SELECT ProductCode, ProductCode+'-03' AS ProductPriceID, ProductPrize*0.5, 500 ProductSize, 'G' ProductUnit
  FROM tblProduct
  WHERE ProductPrize >= 300
UNION ALL
SELECT ProductCode, ProductCode+'-04' AS ProductPriceID, ProductPrize*0.25, 250 ProductSize, 'G' ProductUnit
  FROM tblProduct
  WHERE ProductPrize >= 300
ORDER BY 1, 2

有关详细信息,请参阅SQLFiddle:http://sqlfiddle.com/#!18/0910e/7

以上是关于SQL Server:使用case插入两个表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:是不是可以同时插入两个表?

如何在不同条件的sql server的case语句中插入多个else?

如何比较两个表的列并将值插入到基于 SQL Server 中存储过程中的比较的新表中

SQL Server 中的历史表

使用 pyodbc 批量插入 SQL Server 表:找不到文件

SQL Server 触发器