2013-07-23 14 views
8

みなさんこんにちは。私は私のSQLステートメントに関する質問をしたいと思います。私はSQL Server 2008を使用しており、Workflow Transactionというテーブルを持っています。この表には、12のレコードがあります。下の写真はテーブルの内容です。サブクエリを使用したUPDATE - 必要なレコード以上の更新

enter image description here

私は、このSQL文を持っている:

UPDATE Workflow_Txn 
SET Status = 1 
WHERE [RequestId] IN 
(
    SELECT [RequestId] 
    FROM Workflow_Txn 
    WHERE [OrderNumber] < (SELECT MAX(OrderNumber) FROM Workflow_Txn WHERE RequestId = 3)  
    AND RequestId = 3 
) 

私の目的は、内部のSELECT文から出力される、最大未満の注文番号を持っている要求IDを更新することですWHERE句。今、私は、更新されるレコードが上記のレコードだけであることを期待しています(コードでは、それはRequestId#3です)。

実際に何が起こったかは、4つのレコードが更新されていたのではなく、5つになりました!既存のSQL文に問題はありますか?

答えて

6

問題は、RequestId = 3のすべてのレコードの更新を実行していることです。サブクエリの結果が3であることを考慮して、すべての関連レコードを更新することになります。

あなたのクエリが

UPDATE Workflow_Txn 
SET Status = 1 
WHERE RequestId = 3 

ないあなたはそれが必要以上にあなたのクエリをより複雑にする理由を持っているかどうかわからを行う​​ことと等価です。シンプルな何かがトリック

UPDATE Workflow_Txn 
SET Status = 1 
WHERE [OrderNumber] < (SELECT MAX(OrderNumber) FROM Workflow_Txn WHERE RequestId = 3)  
     AND RequestId = 3 
+0

:私はあなたが探していたと思うことのようなものでした。注文番号よりも低いレコードを更新することを目指しています。つまり、最新のレコードより前にレコードを更新します。 –

+0

@ Ju-chan:私の質問がうまくいくとわかっている限り、テストしましたか? –

6

を行うだろうと私には思われるクエリの問題は、サブクエリが最大値未満の注文番号を持つレコードを検索するために非常に詳細に入るということです。そして、同じ要求ですべてを選択します。最大注文番号が含まれます。

私は次のようにCTEを使用してこの問題を解決することを好む:

with toupdate as (
     select t.*, 
      MAX(OrderNumber) as MaxON 
     from Workflow_txn 
     where RequestId = 3 
    ) 
UPDATE toupdate 
    SET Status = 1 
    where OrderNumber < MaxON; 

私はレコードが更新される可能性のあるものを見るために別途CTEを実行することができますので、私は、この構造が好き。あなたのクエリを修正するに

、あなたがOrderNumberを使用して、要求を変更し、RequestId = 3を繰り返します:

UPDATE Workflow_Txn 
SET Status = 1 
WHERE [RequestId] = 3 and 
     OrderNumber in 
(
    SELECT [OrderNumber] 
    FROM Workflow_Txn 
    WHERE [OrderNumber] < (SELECT MAX(OrderNumber) FROM Workflow_Txn WHERE RequestId = 3)  
    AND RequestId = 3 
) 
+0

私はもっと簡単な方法も好きです(ただし、私の最初の方法は、ソリューションに記載された理由から好きです)。しかし、私は@StuartAinsworthが最初に単純化されたバージョンで答えたと思います。それが私が彼の答えをアップビートした理由です。 –

4

あなたのサブクエリはちょうど3のRequestIDを返すように言ったので、あなたは、そのIDを持つすべての要求を更新しました。それを歩いてください。私はあなたが私を示していることは私のものよりも簡単だったと思う

UPDATE Workflow_Txn 
SET Status = 1 
WHERE [RequestId] = 3 
AND [OrderNumber] < (SELECT MAX(OrderNumber) FROM Workflow_Txn WHERE RequestId = 3) 
関連する問題