0

初期テーブルと結合テーブルの結合に基づいて、SQL Server テーブルの列をインクリメントしようとしています。アイデアは、を更新し、結合から返された行数に基づいて 1 から始まる増分番号に列をtblForm10Objectives設定し、が数値に等しいことです。これまでのクエリの例: ObjectiveNumbertblForm10GoalsObjectivestblForm10ObjectivesID_Form10Goal

Update tblForm10Objectives 
Set ObjectiveNumber = rn
From (
    Select ROW_NUMBER() over (PARTITION by OG.ID_Form10Goal) as rn
        , *
    From (
        Select *
        From tblForm10GoalsObjectives OG
    Join tblForm10Objectives O On OG.ID_Form10Objective = O.ID_Form10Objective
    Where OG.ID_Form10Goal = 4
    Order by O.ID_Form10Objective
) as tblForm10Objectives;

クエリの選択部分が実行されると、列が表示されるので、ObjectiveNumberis currently 0 where ID_Form10Goal= 4であることがわかります

更新が実行されたら、ObjectiveNumberに 1 、 2; を表示する必要があります。ID_Form10Goal= 4には 2 つの行があるためです。

この update ステートメントのロジックに新しいテーブルを導入する必要がありました。テーブル名は tblForm10Goals です。目標は、ID_Form10Goal ではなく ID_Agency によって取得する必要があります。「マルチパート識別子 'dbo.tblForm10Objectives.ID_Form10Objective = rns.ID_Form10Objective' をバインドできませんでした」というエラー メッセージが表示されます。次の SQL Update ステートメントを使用しています。

UPDATE dbo.tblForm10Objectives
SET ObjectiveNumber = rn
FROM tblForm10Goals As g
    Left Join tblForm10GoalsObjectives gobs ON g.ID_Form10Goal = gobs.ID_Form10Goal
    Right Join 
(
    SELECT
        ROW_NUMBER() OVER (PARTITION BY g.ID_Agency
                            ORDER BY OB.ID_Form10Objective) AS rn,
        OB.ID_Form10Objective

    FROM tblForm10Goals g
    LEFT JOIN dbo.tblForm10GoalsObjectives gobs ON g.ID_Form10Goal = gobs.ID_Form10Goal
    RIGHT JOIN dbo.tblForm10Objectives OB ON gobs.ID_Form10Objective = OB.ID_Form10Objective
    Where g.ID_Agency = 2
) rns ON dbo.tblForm10Objectives.ID_Form10Object = rns.ID_Form10Objective
4

1 に答える 1

1

あなたの例では、閉じ括弧がどこかに欠けているようです。テーブル構造を確認しないと、答えを確信できません。2 つのテーブルがあるようです。

tblForm10Objectives
-------------------
ID_Form10Objective
ObjectiveNumber
...

tblForm10GoalsObjectives
------------------------
ID_Form10Goal
ID_Form10Objective
...

この場合、次のクエリで目的の結果が得られるはずです。

UPDATE dbo.tblForm10Objectives
SET ObjectiveNumber = rn
FROM dbo.tblForm10Objectives INNER JOIN
(
    SELECT
        ROW_NUMBER() OVER (PARTITION BY OG.ID_Form10Goal
                            ORDER BY O.ID_Form10Objective) AS rn,
        O.ID_Form10Objective
    FROM dbo.tblForm10Objectives O INNER JOIN
        dbo.tblForm10GoalsObjectives OG ON OG.ID_Form10Objective = O.ID_Form10Objective
    Where OG.ID_Form10Goal = 4
) rns ON dbo.tblForm10Objectives.ID_Form10Objective = rns.ID_Form10Objective

内部の SELECT ステートメントを実行すると、目的の値と、それらの値で更新されるObjectiveNumber対応する値が表示されます。ID_Form10Objective

テーブル構造を投稿すると、私または他の誰かがより役立つ可能性があります。

于 2013-06-08T00:21:55.013 に答える