SQL使用多个选择查询插入到select中

时间:2017-10-09 16:15:00

标签: sql sql-server tsql

我有两张桌子:

  • [PriceTagSticker]
  • [ClientPriceTagSticker]

ClientPriceTagStickerPriceTagSticker的外键。

我需要在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代码。但是 - 我被告知,由于性能问题,光标应该避免。

是否有更有效的方法可以在不使用游标的情况下完成此操作?

1 个答案:

答案 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表中的客户端。我猜你有一个包含所有客户端的另一个表,你可以使用它。