2
UPDATE
    dbo.FormDetail
SET 
    FieldOrder=FieldOrder+1
WHERE
    WHERE DocCode IN (1,2,3)
    AND FieldOrder >= (SELECT FieldOrder FROM dbo.FormDetail
                       WHERE FieldData LIKE '%OldField%'
                       AND DocCode IN (1,2,3))

ここでやろうとしていることがどれほど明確かわかりませんが、特定のフィールドの後でのみ、いくつかのドキュメントFieldOrderのテーブルを増やしたいです (基本的に、新しいフィールドを挿入するためのギャップがあります)。FormDetailしかし明らかな問題は、FieldOrderI get in my Wherewill が、ステートメントが現在更新しているドキュメントに固有のものではないことです。おそらくパーティションを使用して可能だと思っていましたが、セクションでしか使用partitionsしたことがありません。Fromどんな助けでも本当に感謝しています。

アップデート

dbo.FormDetail サンプル データ

DocCode FieldOrder FieldData

1 1 'タイトル'

1 2 'オールドフィールド'

1 3「署名」

2 1 '段落'

2 2 'オールドフィールド'

3 1 'オールドフィールド'

4

2 に答える 2

2

既存のコードでは、サブクエリが1回実行され、すべての結果が1回で外部クエリに返されます。

実際に必要と思われるのは、外部クエリによって処理されるすべての行に対してサブクエリが1回実行されることです。これは、相関サブクエリと呼ばれます。

そのように機能させるために、2つの変更を加えました。
1.サブクエリでテーブルにエイリアスを指定しました
2.外部クエリでテーブルを参照するようにサブクエリのWHERE句を変更しました

UPDATE
  dbo.FormDetail
SET
  FieldOrder=FieldOrder+1
WHERE
  DocCode IN (1,2,3)
  AND FieldOrder >= (SELECT lookup.FieldOrder
                       FROM dbo.FormDetail AS lookup
                      WHERE lookup.FieldData LIKE '%OldField%'
                        AND lookup.DocCode = FormDetail.DocCode
                    )

別の代替手段は、サブクエリに参加することです...

UPDATE
  FormDetail
SET
  FieldOrder=FieldOrder+1
FROM
  dbo.FormDetail
INNER JOIN
(
  SELECT
    DocCode,
    FieldOrder
  FROM
    dbo.FormDetail
  WHERE
    DocCode IN (1,2,3)
    AND FieldData LIKE '%OldField%'
)
  AS lookup
    ON  lookup.DocCode     = FormDetail.DocCode
    AND lookup.FieldOrder >= FormDetail.FieldOrder
于 2012-05-29T08:37:04.207 に答える
0

どのようなエラーが発生していますか? 私が間違っていると思う唯一のことは、サブクエリを制限していないことです。大規模なデータセットでは少し効率が悪いかもしれませんが、今のところ必要なのは MIN(); だけです。

DECLARE @FormDetail TABLE(
    DocCode         INT
,   Fieldorder      INT
,   FieldData       NVARCHAR(MAX)
)

INSERT INTO @FormDetail (DocCode, FieldOrder, FieldData) VALUES (1,1, 'Title')
INSERT INTO @FormDetail (DocCode, FieldOrder, FieldData) VALUES (1,2, 'OldField')
INSERT INTO @FormDetail (DocCode, FieldOrder, FieldData) VALUES (1,3, 'Signature')
INSERT INTO @FormDetail (DocCode, FieldOrder, FieldData) VALUES (2,1, 'Paragraph')
INSERT INTO @FormDetail (DocCode, FieldOrder, FieldData) VALUES (2,2, 'OldField')
INSERT INTO @FormDetail (DocCode, FieldOrder, FieldData) VALUES (3,1, 'OldField')


UPDATE @FormDetail SET      
    FieldOrder = FieldOrder + 1 
WHERE 
    DocCode IN (1,2,3)     
AND FieldOrder >= (
    SELECT MIN(FieldOrder) FROM @FormDetail                        
    WHERE FieldData LIKE '%OldField%'                        
    AND DocCode IN (1,2,3)
) 

SELECT * FROM @FormDetail

以下を与える:

1 2 タイトル

1 3 オールドフィールド

1 4 署名

2 2 パラグラフ

2 3 オールドフィールド

3 2 オールドフィールド

必要なのは、特定のポイントの後に fieldorder をインクリメントすることだけですよね?

于 2012-05-29T08:43:42.307 に答える