2013-06-10 4 views
0

Я пытаюсь обновить tblForm10Objectives, установить столбец ObjectiveNumber в число с добавлением числа, начинающееся с 1, в зависимости от количества строк, возвращаемых из соединения tblForm10Goals, tblForm10GoalsObjectives и tblForm10Objectives, где ID_Agency = идентификатор агентства что в tblForm10Goals,строка инкремента с несколькими связанными таблицами

Пример запроса до сих пор:

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 

внутренний оператор выбора возвращает правильно инкрементируется значения ObjectiveNumber, мне просто нужно обновить dbo.tblForm10Objectives с ObjectiveNumber = гп. Спасибо заранее за любую помощь.

Scripted Столы

Первая таблица

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 
+1

Основываясь на формате вашей функции окна, похоже, что вы используете MS SQL. Если да, пожалуйста, пометьте свой вопрос как таковой, чтобы мы знали, как вам помочь. –

+0

@JonofAllTrades: «* format *» функции окна будет работать на большинстве современных СУБД. Это наличие префикса 'tbl' и схемы' dbo', которые намекают на MS SQL. –

+0

Я изменил его на sql-server-2008, извините за это .... – dhopp

ответ

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 
+0

Сообщение об ошибке: идентификатор многочастности «dbo.Form10Objectives.ID_Form10Objective» не может быть связан. Это отображается на последней строке; rns ON dbo.tblForm10Objectives.ID_Form10Object = rns.ID_Form10Objective Внутренний выбор отлично работает, он извлекает правильные данные с ObjectiveNumbers, как я хотел бы, чтобы они обновлялись в инструкции обновления. Я не могу заставить обновление работать с внутренним выбором ... – dhopp

+0

Ах, я пропустил это.Вы меня отбрасываете, назначая псевдонимы, а затем присоединяясь к использованию имени исходной таблицы и не помещая сначала обновленную таблицу. Я подготовил альтернативу, но, не зная больше об отношениях между вашими столами, это просто выстрел в темноте. –

+0

Есть ли способ, по которому я могу вам прямо по электронной почте? Ваш внутренний выбор также работает. Но проблема все еще находится в операторе обновления, где вызывается SET ObjectiveNumber, он заявляет, что ObjectiveNumber недействителен. И внизу заявление; AS RowNumbers ON GOBS.ID_Form10Objective = RowNumbers.ID_Form10Objective, GOBS.ID_Form10Objective - недопустимый столбец. Я бы опубликовал структуру таблицы, но это не позволит мне опубликовать изображение, в котором мои очки репутации не равны 10 или выше. – dhopp

0

Вот базовый формат из UPDATE с JOIN:

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 
+0

Когда я запускаю запрос, который вы указали выше, я получаю следующую ошибку: Msg 4108, Level 15, State 1, Line 5 Оконные функции могут отображаться только в SELECT или ORDER BY. – dhopp

+0

Итак, переместите скрипт создания Row_Number в подзапрос и только JOIN обновленную таблицу к нему. –