我有一个sql表:
级别
LevelId Min Product
1 x 1
2 y 1
3 z 1
4 a 1
我需要通过仅更改1 2,3 .... 40
中的产品ID将相同的数据复制到数据库中示例
LevelId Min Product
1 x 2
2 y 2
3 z 2
4 a 2
我可以做类似
的事情 INSERT INTO dbo.Levels SELECT top 4 * fROM dbo.Levels
但那只会复制粘贴数据。
有没有办法可以复制数据并粘贴它只更改产品值?
答案 0 :(得分:2)
你大部分都在那里 - 你只需要采取一个更合乎逻辑的步骤:
INSERT INTO dbo.Levels (LevelID, Min, Product)
SELECT LevelID, Min, 2 FROM dbo.Levels WHERE Product = 1
...将使用不同的产品ID复制您的行。
还要考虑WHERE Product = 1
比TOP 4
更可靠。如果表格中有超过四行,您将无法保证TOP 4
将返回相同的四行,除非您还在选择中添加了ORDER BY
,但是WHERE Product = ...
将始终返回相同的行,并且即使您添加产品ID为1的额外行,也会继续工作(因为您必须考虑将TOP 4
更改为TOP 5
,依此类推如果添加额外的行)。
答案 1 :(得分:1)
您可以生成产品ID,然后将其加载到:
with cte as (
select 2 as n
union all
select n + 1
from cte
where n < 40
)
INSERT INTO dbo.Levels(`min`, product)
SELECT `min`, cte.n as product
fROM dbo.Levels l cross join
cte
where l.productId = 1;
这假设LevelId
是一个标识列,在插入时自动递增。如果不是:
with cte as (
select 2 as n
union all
select n + 1
from cte
where n < 40
)
INSERT INTO dbo.Levels(levelid, `min`, product)
SELECT l.levelid+(cte.n-1)*4, `min`, cte.n as product
fROM dbo.Levels l cross join
cte
where l.productId = 1;
答案 2 :(得分:0)
INSERT INTO dbo.Levels (LevelId, Min, Product)
SELECT TOP 4
LevelId,
Min,
2
FROM dbo.Levels
您可以在SELECT
语句中包含表达式,包括硬编码值或Product + 1
或其他任何内容。
我希望你可能不想插入LevelId,但留下那里匹配你的样本。如果您不希望它只是从INSERT
和SELECT
部分删除它。
答案 3 :(得分:0)
例如,您可以对数字表使用CROSS JOIN
。
WITH
L0 AS(SELECT 1 AS C UNION ALL SELECT 1 AS O), -- 2 rows
L1 AS(SELECT 1 AS C FROM L0 AS A CROSS JOIN L0 AS B), -- 4 rows
Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS N FROM L1)
SELECT
lvl.[LevelID],
lvl.[Min],
num.[N]
FROM dbo.[Levels] lvl
CROSS JOIN Nums num
这会重复4次。