一尘不染

SQL查询INSERT一组值,多次WHERE次数,其中一个值由WHERE原因的结果决定

javascript

尝试进行查询以将同一组值多次插入表中,其中一个值是另一个表中的 ID 号,另一个 where 子句的结果确定 ID 的列表

我正在使用类似于以下查询的内容从数据库中提取公司名称列表,这些公司名称安装了特定类型的产品类型(自定义定价等)
目前该列表将用于手动将新产品添加到数据库中该列表中的每个公司(前端只有从公司记录添加的接口)

我想将相同的产品添加到所有公司列表中,因此我的计划是调整下面的查询以列出 CompanyID 编号并使用该列表:

Use DBNAME
SELECT DISTINCT CompanyName
FROM CompanyList JOIN ProductList
ON CompanyList.CompanyID = ProductList.CompanyID
WHERE ProductList.ProductTypeID IN (71,72,73)
ORDER BY CompanyName

SET IDENTITY_INSERT [ProductList] ON

INSERT [dbo].[ProductList]
([ProductID][Name],[ProductTypeID],[Cost],[WholesaleRate],[UndeID],[Limit],[Days],[SortOrder],[Expired],[CompanyID])
VALUES
(-1,'ProductF',77,3.9,5.75,7,0,0,1,No,???)

SET  IDENTITY_INSERT [ProductList] OFF

我希望我需要在 where 中将 CompanyName 替换为 CompanyID,并以将它们包装在事务中并允许插入单步执行 where 的结果的方式将两者结合起来,也许将每个结果作为变量传递给插入?

但我不确定从哪里开始。

感谢您的帮助,如果其他人有此问题,请参阅下面从标记的最佳答案得出的最终工作结果:

Use CVR_Sandbox
begin transaction

INSERT INTO [dbo].[ProductList] ([Name], [ProductTypeID], [Cost], [WholesaleRate], [UndeID], [Limit], [Days], [SortOrder], [Expired], [CompanyID])
    SELECT DISTINCT         'TESTPRODUCTname', 79, 3.9, 5.75, 7, 0, 0, 1, 0, cl.CompanyID
    FROM         CompanyList cl
    JOIN         ProductList pl ON cl.CompanyID = pl.CompanyID
    WHERE         pl.ProductTypeID = 71
    ORDER BY         cl.CompanyID

rollback transaction
--commit transaction

阅读 88

收藏
2022-07-21

共1个答案

一尘不染

您需要编写类似这样的内容 -INSERT INTO基于 a SELECT,其中大多数值是常量(如您的问题中的第二个查询中所定义)。

SET IDENTITY_INSERT [ProductList] ON

INSERT INTO [dbo].[ProductList] ([ProductID], [Name], [ProductTypeID], [Cost], [WholesaleRate], [UndeID], [Limit], [Days], [SortOrder], [Expired], [CompanyID])
    SELECT DISTINCT 
        -1, 'ProductF', 77, 3.9, 5.75, 7, 0, 0, 1, No, pl.CompanyID
    FROM 
        CompanyList cl
    JOIN 
        ProductList pl ON cl.CompanyID = pl.CompanyID
    WHERE 
        pl.ProductTypeID IN (71, 72, 73)
    ORDER BY 
        cl.CompanyName

SET  IDENTITY_INSERT [ProductList] OFF

不知道你为什么要做一个IDENTITY_INSERT ON然后为每一行插入相同的值-1......因为标识列通常是主键 - 这可能是灾难(和错误)的秘诀......你真的需要这个吗?为什么不让数据库分发身份值?毕竟,这就是您定义它们的目的......

2022-07-21