我正在尝试更新tblForm10Objectives,根据从tblForm10Goals,tblForm10GoalsObjectives和tblForm10Objectives的连接返回的行数,将ObjectiveNumber列设置为以1开头的递增数字,其中ID_Agency = tblForm10Goals中的代理ID,< / p>
到目前为止的示例查询:
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
答案 0 :(得分:0)
有三件事情在脑海中浮现。
UPDATE
。RIGHT JOIN
应该是INNER JOIN
。排除第一个表的半连接无法应用任何更新。这是一次尝试改写:
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
答案 1 :(得分: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