所以我有一个看起来像这样的表:
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)。
因此,如果项目000中的任务001的日期为10/28/09,我希望其他项目中的任务001(我知道他们的ID)具有相同的日期。
如果项目001中的任务002的日期为12/1/09,我希望任务002在每个其他项目中都有这个日期。
是否有一个查询可以执行此操作?我认为应该有,但我现在无法理解。
BTW我正在使用SqlServer 2005。
答案 0 :(得分:0)
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的值。
答案 1 :(得分: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
我不确定您使用的是哪种数据库引擎,有些可能允许使用比上述更自然的语法。
上面也明显假设尚未为其他项目设置时隙,并且您正在尝试定义新时隙而不是更新现有时段。
答案 2 :(得分:0)
这应该可以正常工作:
UPDATE projects SET [date] = (SELECT [date] FROM projects p1 WHERE project = '000' AND p1.task = projects.task)
答案 3 :(得分:0)
这就是你想要的,只需用“项目的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 (...)
答案 4 :(得分:0)
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