我有两张桌子:
[PriceTagSticker]
[ClientPriceTagSticker]
ClientPriceTagSticker
有PriceTagSticker
的外键。
我需要在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大脑最初想过迭代结果并使用CURSOR执行单个ClientId代码。但是 - 我被告知,由于性能问题,光标应该避免。
是否有更有效的方法可以在不使用游标的情况下完成此操作?
答案 0 :(得分:0)
使用cross join
生成所有行。然后删除存在的行:
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
);
这使用ClientPricetagSticker
表中的客户端。我猜你有一个包含所有客户端的另一个表,你可以使用它。