使用多个select查询将SQL插入select
我有两张桌子:使用多个select查询将SQL插入select,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有两张桌子: [价格标签] [ClientPriceTagSticker] clientpricetagstapper具有指向pricetagstapper的外键 我需要在ClientPriceTagSticker表中回填一些数据。目标是为ClientPriceTagSticker中的每个ClientId插入所有不存在的PriceTagStickerId 我已经为一个ClientId编写了查询,效果非常好 INSERT INTO [dbo].[ClientPricetagSticker]
[价格标签]
[ClientPriceTagSticker]
clientpricetagstapper
具有指向pricetagstapper
的外键
我需要在ClientPriceTagSticker表中回填一些数据。目标是为ClientPriceTagSticker中的每个ClientId插入所有不存在的PriceTagStickerId
我已经为一个ClientId编写了查询,效果非常好
INSERT INTO [dbo].[ClientPricetagSticker] (ClientId, PricetagStickerId)
SELECT
@clientId, PS.PriceTagStickerId
FROM
[dbo].[PricetagSticker] PS
WHERE
NOT EXISTS(SELECT * FROM [dbo].[ClientPricetagSticker]
WHERE PriceTagStickerId = PS.PriceTagStickerId
AND ClientId = @clientId)
但是,我需要对数据库中的所有ClientId执行此操作,这是此查询的结果:
SELECT DISTINCT ClientId
FROM [dbo].[ClientPricetagSticker]
我的非SQL大脑最初考虑对结果进行迭代,并使用游标执行单个ClientId代码。然而,我被告知,由于性能问题,应该避免使用游标
有没有一种更有效的方法可以不用光标来完成这项工作?使用
交叉连接来生成所有行。然后删除存在的行:
INSERT INTO [dbo].[ClientPricetagSticker] (ClientId, PricetagStickerId)
SELECT c.clientId, PS.PriceTagStickerId
FROM [dbo].[PricetagSticker] ps CROSS JOIN
(SELECT DISTINCT ClientId FROM [dbo].[ClientPricetagSticker]) c
dbo.ClientPricetagSticker cpts
WHERE NOT EXISTS (SELECT 1
FROM dbo.ClientPricetagSticker cpts
WHERE cpts.PriceTagStickerId = PS.PriceTagStickerId AND
cpts.ClientId = c.clientId
);
这将使用clientpricetagstacker
表中的客户机。我猜您有另一个包含所有客户机的表,您可以使用它。使用交叉连接来生成所有行。然后删除存在的行:
INSERT INTO [dbo].[ClientPricetagSticker] (ClientId, PricetagStickerId)
SELECT c.clientId, PS.PriceTagStickerId
FROM [dbo].[PricetagSticker] ps CROSS JOIN
(SELECT DISTINCT ClientId FROM [dbo].[ClientPricetagSticker]) c
dbo.ClientPricetagSticker cpts
WHERE NOT EXISTS (SELECT 1
FROM dbo.ClientPricetagSticker cpts
WHERE cpts.PriceTagStickerId = PS.PriceTagStickerId AND
cpts.ClientId = c.clientId
);
这将使用clientpricetagstacker
表中的客户机。我猜您有另一个包含所有客户机的表,您可以使用它。我确信替换客户机id的工作方式如下插入[dbo]。[ClientPricetagSticker](ClientId,PricetagStickerId)从[dbo]选择ps.ClientId,ps.PricetagStickerId。[PricetagSticker]ps如果不存在(从[dbo]选择*)。[ClientPricetagSticker]cs其中cs.PriceTagSticker id=PS.PriceTagSticker id和ClientId=PS.ClientId=cs.ClientId)
ClientId仅存在于ClientPricetagSticker上,因此:选择PS.ClientId不解析:)我确信替换客户端id的工作方式如下插入[dbo]。[ClientPricetagSticker](ClientId,PriceTagSticker id)从[dbo].[PricetagSticker]ps中选择ps.clientid,ps.PricetagSticker ID(如果不存在)(从[dbo].[ClientPricetagSticker]cs中选择*其中cs.PricetagSticker ID=ps.PricetagSticker ID=ps.clientid=cs.clientid=cs.clientid)
ClientId仅存在于ClientPriceTagSticker上,因此:选择ps.ClientId不解析:)在删除“dbo.ClientPriceTagSticker cpts”行后看起来有效谢谢!您是对的,有一个客户端表-但它位于不同的数据库中:)在删除“dbo.ClientPriceTagSticker cpts”后看起来有效LineThank!您是对的,有一个客户机表-但是它位于不同的数据库中:)