使用一个表中的列并填充另一个表的Sql脚本
我有两张表,产品表和价格表 产品 比率 每个产品有7个级别,每个级别的成本为100200。。。。700 我现在需要一个脚本来获取所有产品ID并填充Rate表,以便最终输出如下所示: 比率 LevelId成本产品ID 等等 目前,我手动插入前7行,然后对每个产品id运行下面的查询使用一个表中的列并填充另一个表的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
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