Sql server 2008 具有多个联接表的增量行

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

我正在尝试更新tblForm10Goals,根据tblForm10Goals、TBLFORM10GoalsTargets和TBLFORM10GoalsTargets的联接返回的行数,将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
第三张表

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

我突然想到三件事

  • tblform10goalsobjections的第一个连接似乎未使用,根据名称,我猜它正在创建重复记录。如果前两个表之间的关系不是一对一,它将中断
    更新
  • 右连接
    可能应该是
    内部连接
    。排除第一个表的半联接无法应用任何更新
  • 你的错误信息是什么?或者你只是没有得到你期望的结果?请提供更多细节

  • 下面是一个尝试重写:

    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的主键。