【问题标题】:move data from one table to another with duplicate rows将数据从一个表移动到另一个具有重复行的表
【发布时间】:2014-04-30 06:54:01
【问题描述】:

我正在编写此查询以将数据从一个表移动到另一个表。

目标表

Task
id
assignedtoid
decription

源表

 id
 taskid
 comments

查询

UPDATE
    Task
SET
    Task.[Description] = TMC.Comment
FROM
    Task    
INNER JOIN     
    TaskComment TMC 
ON     
    Task.Id = TMC.TaskId
WHERE
    Task.AssignToId in(some ids)

问题:有一些任务有多个评论没有随着这个查询移动?

如何实现,我用的是sql server 2005

【问题讨论】:

  • 您自己做过这个查询吗?语法错误。
  • 是的,查询是我做的,似乎是什么问题......
  • 反对的选民至少应该有一些 cmet 反对。另外,如果您无法回答,请停止投票...
  • 您没有正确加入表格。看起来你可以休息一下,走出去,然后重新开始工作。不要介意反对票。它在 SO 中很常见。
  • 您的查询在语法上是正确的。这两个表之间有 1:m 的关系,对吧?那么,如果TaskComment 表中有多行,应该将哪一行写入Task 表?您能给我们提供一个源数据样本和预期结果吗?

标签: sql-server sql-server-2005


【解决方案1】:

只需稍微更改您的查询,但您没有获得其他评论数据,因为这些新记录不存在于您的任务表中。因此,您必须从 TaskComment 表中插入这些新记录。

UPDATE
    Task
SET
    [Description] = TMC.Comment
FROM
    Task t   
INNER JOIN     
    TaskComment TMC 
ON     
    t.Id = TMC.TaskId
WHERE
    t.AssignToId in (1,2,3)

要在 SQL Server 2008 中实现这一点,您可以使用 MERGE 语句,但由于您使用的是 SQL Server 2005,因此您可以使用另一种替代方法(想法取自此处 mimicking-merge-statement-in-sql),如下面的示例说明。

-- Create table1
CREATE TABLE Table1 (Col1 INT, Col2 INT, Col3 VARCHAR(100))
INSERT INTO Table1 (Col1, Col2, Col3)
SELECT 1, 11, 'First'
UNION ALL
SELECT 11, 12, 'Second'
UNION ALL
SELECT 21, 13, 'Third'
UNION ALL
SELECT 31, 14, 'Fourth'
GO
-- Create table2
CREATE TABLE Table2 (Col1 INT, Col2 INT, Col3 VARCHAR(100))
INSERT INTO Table2 (Col1, Col2, Col3)
SELECT 1, 21, 'Two-One'
UNION ALL
SELECT 11, 22, 'Two-Two'
UNION ALL
SELECT 21, 23, 'Two-Three'
UNION ALL
SELECT 31, 24, 'Two-Four'
UNION All
SELECT 21, 33, 'Two-Six'
UNION ALL
SELECT 31, 34, 'Two-Nine'
GO

SELECT *
FROM Table1
SELECT *
FROM Table2
GO


declare @updated_ids table(col2 int)
UPDATE Table1
SET Col2 = t2.Col2,
Col3 = t2.Col3
output inserted.col2 into @updated_ids
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.Col1 = t2.Col1
WHERE t1.Col1 IN (21, 31)

insert into Table1
select col1, col2, col3 from Table2 
where col2 not in(select col2 from @updated_ids)
go

DROP TABLE Table1
DROP TABLE Table2

所以在你的情况下,你应该做类似的事情

declare @updated_ids table(id int)
UPDATE
    Task
SET
    [Description] = TMC.Comment
output inserted.Id into @updated_ids
FROM
    Task t   
INNER JOIN     
    TaskComment TMC 
ON     
    t.Id = TMC.TaskId
WHERE
    t.AssignToId in (1,2,3)

    insert into Task
    select id,
    taskid,
    comments 
    from TaskComment 
    where taskid not in (select id from @updated_ids)
    go

【讨论】:

    猜你喜欢
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多