代码之家  ›  专栏  ›  技术社区  ›  Matthew Jones

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

  •  0
  • Matthew Jones  · 技术社区  · 15 年前

    所以我有一张像这样的桌子:

    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在其他每个项目中也具有此日期。

    是否有一个查询可以做到这一点?我想应该有,但我现在还搞不清楚。

    顺便说一句,我正在使用SQLServer2005。

    5 回复  |  直到 15 年前
        1
  •  0
  •   marc_s HarisH Sharma    15 年前
    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的值。

        2
  •  0
  •   David Andres    15 年前

    也许是这样:

    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
    

    我不确定您使用的是哪个数据库引擎,有些引擎可能允许使用比上面更自然的语法。

    上面显然还假定其他项目的时间段还没有设置,并且您正在尝试定义新的时间段,而不是更新现有的时间段。

        3
  •  0
  •   Lukasz Lysik    15 年前

    这应该很有效:

    UPDATE projects SET [date] = (SELECT [date] FROM projects p1 WHERE project = '000' AND p1.task = projects.task)
    
        4
  •  0
  •   MyItchyChin JNK    15 年前

    这是您想要的,只需用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 (...)
    
        5
  •  0
  •   marc_s HarisH Sharma    15 年前
    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