0

我正在尝试更新 tblForm10Objectives,根据从 tblForm10Goals、tblForm10GoalsObjectives 和 tblForm10Objectives 的连接返回的行数,将 ObjectiveNumber 列设置为从 1 开始的递增数字,其中 ID_Agency = tblForm10Goals 中的代理 ID,

到目前为止的示例查询:

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

内部 select 语句返回正确递增的 ObjectiveNumber 值,我只需要使用 ObjectiveNumber = rn 更新 dbo.tblForm10Objectives。提前感谢您的任何帮助。

脚本表

第一个表

 CREATE TABLE [dbo].[tblForm10Goals](
    [ID_Form10Goal] [int] IDENTITY(1,1) NOT NULL,
    [ID_Agency] [int] NOT NULL,
    [GoalNumber] [int] NULL,
    [GoalDescription] [varchar](1200) NULL,
    [Locked] [bit] NULL,
 CONSTRAINT [PK_tblForm10Goals] PRIMARY KEY CLUSTERED 
(
    [ID_Form10Goal] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

第二张表

CREATE TABLE [dbo].[tblForm10GoalsObjectives](
    [ID_Form10GoalObjective] [int] IDENTITY(1,1) NOT NULL,
    [ID_Form10Goal] [int] NOT NULL,
    [ID_Form10Objective] [int] NOT NULL,
 CONSTRAINT [PK_tblForm10GoalsObjectives] PRIMARY KEY CLUSTERED 
(
    [ID_Form10GoalObjective] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

第三表

CREATE TABLE [dbo].[tblForm10Objectives](
    [ID_Form10Objective] [int] IDENTITY(1,1) NOT NULL,
    [ObjectiveNumber] [int] NULL,
    [ObjectiveDescription] [varchar](1200) NULL,
    [UnitofMeasure] [varchar](100) NULL,
    [Q1Target] [varchar](50) NULL,
    [Q1Actual] [varchar](50) NULL,
    [Q1ActualLocked] [bit] NULL,
    [Q2Target] [varchar](50) NULL,
    [Q2Actual] [varchar](50) NULL,
    [Q2ActualLocked] [bit] NULL,
    [Q3Target] [varchar](50) NULL,
    [Q3Actual] [varchar](50) NULL,
    [Q3ActualLocked] [bit] NULL,
    [Q4Target] [varchar](50) NULL,
    [Q4Actual] [varchar](50) NULL,
    [Q4ActualLocked] [bit] NULL,
    [AnnualTarget] [varchar](50) NULL,
    [AnnualActual] [varchar](50) NULL,
    [AnnualActualLocked] [bit] NULL,
    [TargetsLocked] [bit] NULL,
    [Locked] [bit] NULL,
 CONSTRAINT [PK_tblForm10Objectives] PRIMARY KEY CLUSTERED 
(
    [ID_Form10Objective] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
4

2 回答 2

0

这是带有 JOIN 的 UPDATE 的基本格式:

UPDATE
    A
SET
    A.field = B.field
FROM table1 A
JOIN table2 B
    ON A.ID = B.ID
WHERE --Additional limiting criteria if needed.

鉴于此,并假设您的联接正常工作,我相信以下内容应该有效:

UPDATE
    OB
SET
    ObjectiveNumber =   ROW_NUMBER() OVER (PARTITION BY g.ID_Agency
                        ORDER BY 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
于 2013-06-10T23:29:15.507 回答
0

三件事浮现在脑海。

  1. tblForm10GoalsObjectives 的第一个连接似乎未使用,根据名称我猜它正在创建重复记录。如果前两个表之间的关系不是一对一的,它将破坏UPDATE.
  2. RIGHT JOIN应该是INNER JOIN一个. 排除第一个表的半联接无法应用任何更新。
  3. 你的错误信息是什么?或者你只是没有得到你期望的结果?请详细点。

这是一个尝试的重写:

UPDATE Objs
SET ObjectiveNumber = RowNumbers.RowNumber
FROM tblForm10Objectives AS Objs
    INNER JOIN tblForm10GoalsObjectives AS GObjs ON Objs.ID_Form10Objective = GObjs.ID_Form10Objective
    INNER JOIN
        (
        SELECT
            Objs.ID_Form10Objective,
            ROW_NUMBER() OVER (PARTITION BY G.ID_Agency ORDER BY Objs.ID_Form10Objective) AS RowNumber
        FROM
            dbo.tblForm10Objectives AS Objs
            INNER JOIN dbo.tblForm10GoalsObjectives AS GObjs ON Objs.ID_Form10Objective = GObjs.ID_Form10Objective
            INNER JOIN tblForm10Goals AS G ON GObjs.ID_Form10Goal = G.ID_Form10Goal
        WHERE
            G.ID_Agency = 2
        ) AS RowNumbers ON GObjs.ID_Form10Objective = RowNumbers.ID_Form10Objective
于 2013-06-10T23:00:39.250 回答