SQL Query – Копировать значения в одной таблице

Итак, у меня есть таблица, которая выглядит так:

 Дата TaskID TaskID
 000 001 10/28/09
 000 002 12/1/09
 000 003 02/24/10
 001 001 04/14/10
 001 002 07/5/10
 001 003 02/24/11
 002 001 06/07/10
 002 002 07/7/10
 002 003 09/13/12

Предположим, что существует много проектов и много задач, но каждый проект содержит те же задачи. Я хочу скопировать даты следующим образом:

Один проект (000) имеет мастер-даты. Я хочу скопировать эти даты для каждой задачи в несколько других проектов (001, 002 в данных примера).

Итак, если задача 001 в проекте 000 имеет дату 10/28/09, я хочу, чтобы задача 001 в других проектах (я знаю их идентификаторы) имела ту же дату.

Если задача 002 в проекте 001 имеет дату 12/1/09, я хочу, чтобы задача 002 также имела эту дату в каждом из других проектов.

Есть ли один запрос, который может это сделать? Я думаю, что должно быть, но я не могу понять это сейчас.

BTW Я использую SqlServer 2005.

UPDATE dbo.Projects SET Date = (SELECT Date FROM dbo.Projects p1 WHERE p1.ProjectID = '000' AND p1.TaskID = dbo.Projects.TaskID) WHERE ProjectID IN ('P01', 'P02', 'P03', 'P04') AND TaskID IN ('001', '002', '003') 

Это сделает это для вас?

Таким образом, для TaskID = 001 это утверждение будет

  SELECT Date FROM dbo.Projects WHERE ProjectID = '000' AND TaskID = '001' 

а затем обновить каждый из проектов (P01-P04) и TaskID = 001 до этой даты. Это то, что вы ищете, нет?

Вы также можете использовать предложение OUTPUT для PROVE для вас, что обновляется:

 UPDATE dbo.Projects SET Date = (SELECT Date FROM dbo.Projects p1 WHERE p1.ProjectID = '000' AND p1.TaskID = dbo.Projects.TaskID) OUTPUT inserted.ProjectID, inserted.TaskID, inserted.Date WHERE ProjectID IN ('P01', 'P02', 'P03', 'P04') AND TaskID IN ('001', '002', '003') 

Это приведет к обновлению каждой строки для вывода новых значений (например, после обновления), чтобы вы могли проверить и узнать, что обновляется, и каковы значения.

Просто выполнил запрос, и это результаты, которые я получаю:

 ProjectID TaskID Date 0 1 2009-10-28 00:00:00.000 0 2 2009-12-01 00:00:00.000 0 3 2010-02-24 00:00:00.000 1 1 2009-10-28 00:00:00.000 1 2 2009-12-01 00:00:00.000 1 3 2010-02-24 00:00:00.000 2 1 2009-10-28 00:00:00.000 2 2 2009-12-01 00:00:00.000 2 3 2010-02-24 00:00:00.000 

Даты для проектов 1 и 2 и Задачи 1,2,3 были установлены на значения «основного» проекта 0.

Возможно, что-то вроде этого:

 INSERT INTO Projects(ProjectID, TaskID, Date) SELECT P2.ProjectId, P1.TaskID, P1.Date FROM Projects P1 CROSS JOIN (SELECT DISTINCT ProjectID FROM Projects WHERE ProjectId <> '000') P2 

Я не уверен, какой механизм базы данных вы используете, а некоторые могут допускать более естественный синтаксис, чем выше.

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

Это должно работать нормально:

 UPDATE projects SET [date] = (SELECT [date] FROM projects p1 WHERE project = '000' AND p1.task = projects.task) 

Это то, что вы хотите, просто замените «…» на список проектов CSV.

 UPDATE c SET c.Date = p.Date FROM Projects AS [c] JOIN Projects AS [p] ON p.TaskID = c.TaskID AND p.ProjectID = '000' WHERE c.ProjectID IN (...) 
 DECLARE @MasterProjectId varchar(10) DECLARE @ChildProjectIds varchar(100) Select @MasterProjectId = '000', @ChildProjectIds = '''123'',''456''' EXECUTE sp_executesql N'Update childProjects Set childProjects.[Date]= masterProject.[Date] from Projects masterProject Inner join Projects childProjects on childProjects.TaskId = masterProject.TaskId and childProjects.ProjectId in (' + @ChildProjectIds + ') where masterProject.ProjectId = ' + @MasterProjectId