Цикл обновления SQL, возвращающий последнее значение для всех записей? - PullRequest
0 голосов
/ 06 октября 2019

Попытка ежедневно обновлять цену моего стола для определенной партии продаж каждый день.

Все отпечатки возвращают правильный 'PLU' и счетчик, но все они обновляются с одинаковым результатом?

declare @RowCount int
declare @Starter int
declare @tempPLU varchar(50)

Set @RowCount = (Select count(@@ROWCOUNT) from Filemaker.dbo.BatchAverageSales 
                 where BatchID = 2404)
set @Starter = 0

while (@Starter < @RowCount)
begin 
    set @tempPLU = (select top(1) Filemaker.dbo.BatchAverageSales.PLU 
                    from Filemaker.dbo.BatchAverageSales 
                    where Filemaker.dbo.BatchAverageSales.RRP is null)

    update F
    set F.RRP = final.RRP
    from Filemaker.DBO.BatchAverageSales as F 
    cross join
        (select product.fldProductPrice as RRP from PRODUCT) final
    inner join Product on F.PLU = product.fldProductCode
    where f.PLU = @tempPLU

    print(@tempPLU)
    print(@starter)

    set @Starter = @Starter + 1
end

Панель печати SQL

(1 row affected)
0321
0

(1 row affected)
0504
1

(1 row affected)
0511
2

(1 row affected)
0512
3

(1 row affected)
0516
4

(1 row affected)
0526
5

(1 row affected)
0568
6

(1 row affected)
1072
7

(1 row affected)
2525
8

(1 row affected)
2565
9

(1 row affected)
3505
10

(1 row affected)
3525
11

(1 row affected)
4521
12

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Вот странный код ....

  update F
set F.RRP = final.RRP
from Filemaker.DBO.BatchAverageSales as F 
cross join
    (select product.fldProductPrice as RRP from PRODUCT) final

final.RRP одинаков на каждом шаге вашего цикла и (я думаю) равен fldProductPrice в последней записи таблицы Product.

Может быть так и должно быть

      update F
set F.RRP = final.RRP
from Filemaker.DBO.BatchAverageSales as F 
cross join
    (select product.fldProductPrice as RRP from PRODUCT 
      where fldProductCode = F.PLU ) final

Или (на мой вкус) более короткое решение

declare @BatchID int = 2404
update BAS 
set RRP = P.fldProductPrice
from Filemaker.dbo.BatchAverageSales BAS
join  Product P on F.PLU = P.fldProductCode
where BAS.BatchID = @BatchID
0 голосов
/ 06 октября 2019

Почему вы сохраняете значение в @tempPLU, а затем используете его для обновления. Вместо того, почему вы не используете запрос выбора напрямую как подзапрос в операторе выбора, как показано ниже.

    declare @RowCount int
    declare @Starter int
    declare @tempPLU varchar(50)
    Set @RowCount = (Select count(@@ROWCOUNT) from Filemaker.dbo.BatchAverageSales where BatchID = 2404)
    set @Starter = 0

    while (@Starter < @RowCount)
    Begin 
    update F
    set F.RRP = final.RRP
    from Filemaker.DBO.BatchAverageSales as F cross join
        (select product.fldProductPrice as RRP from PRODUCT) final
    inner join Product on F.PLU = product.fldProductCode
    where f.PLU = (select top(1)Filemaker.dbo.BatchAverageSales.PLU from Filemaker.dbo.BatchAverageSales where Filemaker.dbo.BatchAverageSales.RRP is NULL )
    print(@starter)
    set @Starter = @Starter + 1

    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...