Sql server 2008 具有多个联接表的增量行
我正在尝试更新tblForm10Goals,根据tblForm10Goals、TBLFORM10GoalsTargets和TBLFORM10GoalsTargets的联接返回的行数,将ObjectiveNumber列设置为递增的数字,从1开始,其中ID_Agency=tblForm10Goals中的代理ID 到目前为止的查询示例:Sql server 2008 具有多个联接表的增量行,sql-server-2008,Sql Server 2008,我正在尝试更新tblForm10Goals,根据tblForm10Goals、TBLFORM10GoalsTargets和TBLFORM10GoalsTargets的联接返回的行数,将ObjectiveNumber列设置为递增的数字,从1开始,其中ID_Agency=tblForm10Goals中的代理ID 到目前为止的查询示例: UPDATE dbo.tblForm10Objectives SET ObjectiveNumber = rn FROM tblForm10Goals As g
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
第三张表
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
我突然想到三件事
更新
右连接
可能应该是内部连接
。排除第一个表的半联接无法应用任何更新下面是一个尝试重写:
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
以下是带有连接的更新的基本格式:
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
根据窗口函数的格式,看起来您正在使用MS SQL。如果是这样,请将您的问题标记为这样,以便我们知道如何帮助您。@JonofAllTrades:window函数的“格式”将适用于大多数现代DBMS。提示MS SQL的是
tbl
前缀和dbo
模式。我将其更改为SQL-server-2008,对此表示抱歉……当我运行您上面给出的查询时,我得到以下错误:Msg 4108,级别15,状态1,第5行窗口函数只能出现在SELECT或ORDER BY子句中。因此,请将行号创建脚本移动到子查询中,并仅将更新的表加入其中。错误消息是:无法绑定多部分标识符“dbo.form10objections.ID\u Form10Objective”。这显示在最后一行;rns ON dbo.tblForm10Objectives.ID_Form10Object=rns.ID_Form10Objective内部选择非常有效,它使用objectiveNumber提取正确的数据,我希望它们在update语句中更新。我无法得到更新,以与内部选择工作…啊,我错过了。你给我分配别名,然后使用原始表名加入,而不是把更新的表放在第一位,这让我很恼火。我已经起草了一份备选方案,但在不了解更多关于您的表格之间关系的情况下,这只是一个偶然的机会。有没有办法我可以直接给您发电子邮件?你内心的选择也很有效。但问题仍然存在于update语句中,在该语句中调用了SET ObjectiveNumber,它声明ObjectiveNumber无效。而在底部的声明;由于GOBS.ID_Form10Objective=RowNumbers.ID_Form10Objective上的行数,GOBS.ID_Form10Objective是无效列。我会发布表结构,但这不会让我发布我的声誉点数不等于10或更高的图像。我更喜欢在这里进行散列。请不要发布图像,一个更好的选择是CREATE TABLE
脚本(请简化为仅包含字段、PKs和UKs,无需SET ANSI_NULLS
样板文件)。另外,如果你能解释表之间的关系,那也会有帮助。我在我原来的帖子下面发布了脚本化的表。脚本化表位于“脚本化表”标题下。第一个表的主键为ID_Form10Goal。第二个表具有ID_Form10GoalObjective的主键和以下外键;ID_构成目标,ID_构成目标。TBLFORM10Objections有一个ID_Form10Objective的主键。