使用一个表中的列并填充另一个表的Sql脚本

使用一个表中的列并填充另一个表的Sql脚本,sql,sql-server,sql-server-2008,tsql,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2008 R2,我有两张表,产品表和价格表 产品 比率 每个产品有7个级别,每个级别的成本为100200。。。。700 我现在需要一个脚本来获取所有产品ID并填充Rate表,以便最终输出如下所示: 比率 LevelId成本产品ID 等等 目前,我手动插入前7行,然后对每个产品id运行下面的查询 INSERT INTO dbo.Rate (LevelID, Cost, ProductId) SELECT LevelID, Cost, ProductId FROM dbo.Rate WHERE Produc

我有两张表,产品表和价格表

产品

比率

每个产品有7个级别,每个级别的成本为100200。。。。700

我现在需要一个脚本来获取所有产品ID并填充Rate表,以便最终输出如下所示:

比率

LevelId成本产品ID

等等

目前,我手动插入前7行,然后对每个产品id运行下面的查询

INSERT INTO dbo.Rate (LevelID, Cost, ProductId)
    SELECT LevelID, Cost, ProductId FROM dbo.Rate WHERE ProductId = 1
你能告诉我如何完全自动化我的工作吗

CREATE TABLE #temp (levelid INT)

INSERT INTO #temp (levelid) 
SELECT 1
UNION ALL
SELECT 2
UNION ALL 
SELECT 3
UNION ALL 
SELECT 4 
UNION ALL 
SELECT 5
UNION ALL  
SELECT 6
UNION ALL 
SELECT 7

insert into dbo.rate
SELECT levelid, (levelid * 100) AS cost, productid
FROM dbo.Product 
CROSS JOIN #temp

DROP TABLE #temp
我创建了一个包含7个级别的临时表,然后使用它。交叉连接创建每个级别和每个产品id的组合

 INSERT INTO Rate
 SELECT   bs.level, bs.costs, P.productid
 FROM
     (SELECT 1 as level, 100 as cost
      UNION ALL
      SELECT 2 as level, 200 as cost
      UNION ALL
      SELECT 3 as level, 300 as cost
      UNION ALL
      SELECT 4 as level, 400 as costs
      UNION ALL
      SELECT 5 as level, 500 as costs
      UNION ALL
      SELECT 6 as level, 600 as costs
      UNION ALL
      SELECT 7 as level, 600 as costs) bs,
   Product P
我创建了一个包含7个级别的临时表,然后使用它。交叉连接创建了每个级别和每个产品id的组合。

请查看:

 INSERT INTO Rate
 SELECT   bs.level, bs.costs, P.productid
 FROM
     (SELECT 1 as level, 100 as cost
      UNION ALL
      SELECT 2 as level, 200 as cost
      UNION ALL
      SELECT 3 as level, 300 as cost
      UNION ALL
      SELECT 4 as level, 400 as costs
      UNION ALL
      SELECT 5 as level, 500 as costs
      UNION ALL
      SELECT 6 as level, 600 as costs
      UNION ALL
      SELECT 7 as level, 600 as costs) bs,
   Product P
CTE可以使用算法创建虚拟数据表,因此无需手动创建充满可预测数据的表。一个使用六个UNION-ALLs的查询并没有那么糟糕,但是数百个、数千个或数百万个呢?如果您有超过100个递归,但不超过32767个,则需要添加选项MAXRECURSION n,其中n是您需要的循环数,或者如果您有超过32767个循环,则需要添加选项MAXRECURSION 0并小心无限循环。

查看:


CTE可以使用算法创建虚拟数据表,因此无需手动创建充满可预测数据的表。一个使用六个UNION-ALLs的查询并没有那么糟糕,但是数百个、数千个或数百万个呢?如果有超过100个递归,但不超过32767个,则需要添加选项MAXRECURSION n,其中n是所需的循环数,或者如果有超过32767个循环,则需要添加选项MAXRECURSION 0,并小心无限循环。

如果可以访问master..spt\u values表,则只需将其抛出即可,你可以做这个小把戏:

insert into rate
select distinct s.number, s.number * 100, p.productid
from product p 
  join master..spt_values s
     on s.number > 0 and s.number < 8

假设您可以访问master..spt_values表,您可以执行以下小技巧:

insert into rate
select distinct s.number, s.number * 100, p.productid
from product p 
  join master..spt_values s
     on s.number > 0 and s.number < 8

谢谢你的参考。我一直想调查这件事。谢谢你的参考。我一直想调查这件事。
WITH CTE AS
(SELECT 1 as LevelID , 100 as Cost
 UNION ALL
 SELECT LevelID + 1 , Cost + 100 
 FROM CTE 
 WHERE LevelID < 7)
INSERT INTO Rate
SELECT CTE.LevelID, CTE.Cost, Product.ProductID
FROM CTE CROSS JOIN Product
insert into rate
select distinct s.number, s.number * 100, p.productid
from product p 
  join master..spt_values s
     on s.number > 0 and s.number < 8