SQL查询 - 复制同一表中的值

时间:2009-09-09 14:55:41

标签: sql sql-server sql-server-2005

所以我有一个看起来像这样的表:

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。

5 个答案:

答案 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