使用多个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!您是对的,有一个客户机表-但是它位于不同的数据库中:)