2012-05-07 7 views
1

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

誰かが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 
+0

ようこそStackOverflow:コード、XML、またはデータサンプルを投稿する場合は、テキストエディタでこれらの行を強調表示し、エディタツールバーの[コードサンプル]ボタン( '{}')をクリックしてくださいフォーマットと構文はそれを強調する! –

+3

ああ、あなたは本当にあなたの派生テーブルに与えるエイリアスを再利用すべきではありません、私は同じクエリで3つの異なる 'fc2'テーブルを数えます。 – Lamak

答えて

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です。

+0

はい、私は前回お世話になりました。これを私のWhileループの中に置くか、ここにあるように実行する必要がありますか? –

+0

ループ内でスクリプトを実行しましたが、レコードを変更しませんでした。私はコードを見ましたが、私には何も分かりません。おかげさまでNikola! –

+0

@ToddSオリジナルのアップデートをこのアップデートに置き換えることを考えましたが、テーブル名を実際のものに置き換えてCustomerPNフィルタを追加する必要があります。そしてあなたは歓迎です:-) –

関連する問題