使用select语句和while循环插入表中

时间:2016-07-21 10:36:15

标签: sql sql-server

我需要从另一个表中将值插入表中。我还想使用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

谁能看到我做错了什么?

4 个答案:

答案 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