【问题标题】:Need to port data in sql child table需要在sql子表中移植数据
【发布时间】:2012-05-11 21:41:18
【问题描述】:

需要在sql表中移植数据

我有一个包含列的主表 (masterid, masterdata, year)。这里masterid 是一个标识列。

我有 2012 年的数据。我需要与 2013 年相同的 2012 年数据

我可以通过简单地运行如下 SQL 语句来解决问题:

INSERT INTO mastertable
    SELECT masterdata, 2013 
    FROM mastertable WHERE Year = 2012

我也想为子表运行类似的运行。

我的子表结构是:(childid , masterid, childdata)

这里我有 2012 年的子数据,我想在第一步中为 2013 年的主数据创建正确的 masterid 以获取 2013 年的类似数据。

最好我想在不添加额外临时列的情况下获得解决方案

非常感谢任何线索。

问候, 库马尔。

【问题讨论】:

  • “这里我有 2012 年的子数据,我想在第一步中为 2013 年的主数据创建适当的 masterid 的 2013 年类似数据。”不是很清楚
  • 2013 年我在 mastertable 中创建了行。我需要使用在主表中创建的正确主 ID 复制子表中的数据,因为子表引用了主表。

标签: sql sql-server data-import


【解决方案1】:

您需要存储在 mastertable 表中创建的 2013 年和 2012 年记录之间的链接。如果您想在不添加任何额外临时列的情况下实现此目的,则需要使用 T-SQL。

(我猜到 masterdata 的类型是 varchar(max),因为您没有指定它的类型)。

DECLARE @links TABLE ( masterid int, newmasterid int )
DECLARE @mastertemp TABLE ( masterid int, masterdata varchar(max) )

DECLARE @masterid int,
        @masterdata varchar(max)

INSERT INTO @mastertemp
SELECT      masterid,
            masterdata
FROM        mastertable
WHERE       [year] = 2012

WHILE EXISTS ( SELECT TOP 1 * FROM @mastertemp )
BEGIN
    SELECT TOP 1    @masterid = masterid,
                    @masterdata = masterdata
    FROM            @mastertemp

    INSERT INTO mastertable
    VALUES ( @masterdata, 2013 )

    INSERT INTO @links
    VALUES ( @masterid, SCOPE_IDENTITY() )

    DELETE FROM @mastertemp
    WHERE       masterid = @masterid
END

INSERT INTO childtable
SELECT      l.newmasterid,
            c.childdata
FROM        childtable c
INNER JOIN  @links l ON c.masterid = l.masterid

【讨论】:

  • 您的解决方案绝对正确。检查任何选项以避免临时表和 while 循环。
  • @kumar:据我所知,没有临时表或创建临时列是不可能的。
【解决方案2】:

假设ChildId 是具有自动增量的标识列

您可以将它们包装在函数/存储过程中,而无需临时表。

更新

Declare @Year     int

SET @Year = 2011

INSERT INTO MasterTable 
SELECT masterdata, 2013
FROM mastertable WHERE Year = @Year

INSERT INTO childtable
SELECT SCOPE_IDENTITY(), c.childdata
FROM childtable c
WHERE masterid in 
(
   SELECT masterid
   FROM masterTable
   WHERE Year = @Year
)

【讨论】:

  • 这不会设置正确的 childtable.masterid 值,它们仍将指向 2012 年的记录。您的查询实际上是在复制那里已经存在的childtable 数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
相关资源
最近更新 更多