我需要从另一个表中将值插入表中。我还想使用while循环同时更新表中的行。您可以在下面看到我的查询。
declare @id int
select @id = 1
while @id >=1 and @id <= 3
begin
INSERT INTO [dbo].[TEST]
([ID_PRODUCT],[PRODUCTID],[PRODUCTDESC],[COUNT]
select distinct
ID_PRODUCT,PRODUCTID,PRODUCTDESC,@id
from SAMPLES
select @id = @id + 1
end
这可行但不像我期待的那样。而不是给我三行影响,它给了我三行受影响,三次。所以我最终得到九个新行,而不是我想要的三个新行。
ID_PRODUCT PRODUCTID PRODUCTDESC COUNT
35746 136559 Desc1 1
35747 276732 Desc2 1
35748 259910 Desc3 1
35746 136559 Desc1 2
35747 276732 Desc2 2
35748 259910 Desc3 2
35746 136559 Desc1 3
35747 276732 Desc2 3
35748 259910 Desc3 3
我想要实现的是:
ID_PRODUCT PRODUCTID PRODUCTDESC COUNT
35746 136559 Desc1 1
35747 276732 Desc2 2
35748 259910 Desc3 3
谁能看到我做错了什么?
答案 0 :(得分:1)
Insert语句的SELECT部分始终返回相同的记录 @id不会更改所选行,只会插入具有不同@id值的相同数据集
select distinct
ID_PRODUCT,PRODUCTID,PRODUCTDESC,@id
from SAMPLES
答案 1 :(得分:0)
您正在使用不同的@id
插入三次相同的行列表。
我猜你的意思是:
;with DistinctSampleValues as
(
select distinct
ID_PRODUCT,PRODUCTID,PRODUCTDESC
from SAMPLES
)
insert into [dbo].[TEST] ([ID_PRODUCT],[PRODUCTID],[PRODUCTDESC],[COUNT])
select
ID_PRODUCT,PRODUCTID,PRODUCTDESC,
ROW_NUMBER() OVER(ORDER BY ID_PRODUCT) RN
from DistinctSampleValues
一次插入所有不同的值和附加的“行号”。
答案 2 :(得分:0)
你很亲密。添加top 1 and where
<{1}}等ID_PRODUCT not in Test table
条款
declare @id int
select @id = 1
while @id >=1 and @id <= 3
begin
INSERT INTO [dbo].[TEST]
([ID_PRODUCT],[PRODUCTID],[PRODUCTDESC],[COUNT]
SELECT DISTINCT TOP 1
ID_PRODUCT,
PRODUCTID,
PRODUCTDESC,
@id
from
SAMPLES S
WHERE
S.ID_PRODUCT NOT IN
(
SELECT T.ID_PRODUCT FROM [TEST] T
)
select @id = @id + 1
end
答案 3 :(得分:0)
Eralper和Ivan Starostin都正确回答,这对你来说是正确的解决方案。
要正确运行代码,需要添加WHERE子句。
declare @id int
select @id = 1
while @id >=1 and @id <= 3
begin
INSERT INTO [dbo].[TEST]
([ID_PRODUCT],[PRODUCTID],[PRODUCTDESC],[COUNT]
select distinct
ID_PRODUCT,PRODUCTID,PRODUCTDESC,@id
from
SAMPLES s
WHERE Count = @id
AND NOT EXISTS(SELECT 1 FROM Test t WHERE t.ID_PRODUCT = s.ID_PRODUCT
AND t.PRODUCTID = s.PRODUCTID)
select @id = @id + 1
end