1

CROSS APPLY パラメーターを使用して SQL Server 2008 開発者データベースで正常に動作する次のスクリプトを作成しましたが、SQL Server 2000 データベースを使用していて SSMS の互換性設定を変更したくないクライアントでは動作しません。

CROSS APPLY パラメータを使用しないように、以下のスクリプトを変換する方法を誰かが提案できますか? ありがとう!

DECLARE @Flag INT
SET @Flag = 1
WHILE (@Flag < (SELECT TOP 1 (COUNT(CUSTOMERPN)) AS COUNTCUST FROM FC_Nestle
GROUP BY CustomerPN
ORDER BY COUNTCUST DESC))
BEGIN
--UPDATE AFS_TOPRODUCE COUNTS
UPDATE FC_Nestle
SET AFS_ToProduce = CustReqQty - AFS_OH
--UPDATE SUBSEQUENT AFS_OH INVENTORY COUNTS
update FC_Nestle 
set AFS_OH = - fc2.AFS_ToProduce 
from FC_Nestle 
CROSS APPLY 
(   
    select fc2.AFS_ToProduce   
    from    
    (     
        select top 1         
            fc2.AFS_ToProduce       
        from FC_Nestle fc2      
        where fc2.ForecastID < FC_Nestle.ForecastID and fc2.CustomerPN = FC_Nestle.CustomerPN     
        order by fc2.ForecastID desc   
    ) fc2   
    where fc2.AFS_ToProduce < 0 
) fc2 
where FC_Nestle.AFS_ToProduce > 0 
SET @Flag = @Flag + 1
END
4

1 に答える 1

2

これはあなたを助けるはずです:

update fc_test
   set AFS_OH = - fc2.AFS_ToProduce
  from fc_test
 -- Self join to find previous row
 inner join fc_test fc2
 -- which has lower forecastid
    on fc2.ForecastID < fc_test.ForecastID
 where fc_test.AFS_ToProduce > 0
 -- and negative afs_toproduce
   and fc2.afs_toproduce < 0
 -- and is a row immediately before
 -- ie there is no other row closer to fc_test then current fc2
   and not exists (select null 
                     from fc_test fc3
                    where fc3.forecastid > fc2.forecastid
                      and fc3.ForecastID < fc_test.ForecastID)

前回と同じテーブル名と列名を使用しています。

ライブ テストはSql Fiddleにあります。

于 2012-05-07T21:55:56.023 に答える