SQL-запрос - копировать значения в одну таблицу - PullRequest
0 голосов
/ 09 сентября 2009

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

ProjectID    TaskID     Date
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 дата 28.10.09, я хочу, чтобы у задачи 001 в других проектах (я знаю их идентификаторы) была та же дата.

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

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

Кстати, я использую SqlServer 2005.

Ответы [ 5 ]

0 голосов
/ 09 сентября 2009
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
0 голосов
/ 09 сентября 2009

Это то, что вы хотите, просто замените "..." на список проектов 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 (...)
0 голосов
/ 09 сентября 2009

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

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

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

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

0 голосов
/ 09 сентября 2009

Это должно работать просто отлично:

UPDATE projects SET [date] = (SELECT [date] FROM projects p1 WHERE project = '000' AND p1.task = projects.task)
0 голосов
/ 09 сентября 2009
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, чтобы доказать вам, что обновляется:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...