2014-08-28 73 views
0

我想弄清楚如何实现下面描述的alter脚本。如果已经插入/选择,我很熟悉基础知识,但这更复杂。SQL alter script - 从一个表复制到另一个

我有一个遗留表,并需要将其数据移动到一个新的表格与更多的列。新表已经公开给一些选择用户,他们可能已经手动移动了公共数据。

所以对于LegacyTable每一行:

  • 看它是否已经在NewImprovedTable存在(通过检查上存在两个表中的字符串场比赛)
  • 如果不是,复制其到NewImprovedTable
  • 不管它是否已被用户复制到NewImprovedTable自动刚才,或以前...
    • 自动填充在NewImprovedTable一个新的名称字段(必须是唯一的 - 如“Legacy1”,“Legacy2 ”等)
    • 设置IsLegacy标志NewImprovedTable

我需要在MS SQL和Oracle都实现这一点,但一旦我制定出一个逻辑,我可以找出在语法其他。

+1

听起来好像MERGE语句是必经之路为你而去。 – tilley31 2014-08-28 15:13:52

回答

0

我对解决该解决方案(在SQL Server - 仍然需要移植到Oracle):

IF NOT EXISTS(SELECT 1 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_NAME = 'NewImprovedTable' 
     AND COLUMN_NAME = 'legacyFlg') 
BEGIN 

    ALTER TABLE [NewImprovedTable] 
    ADD legacyFlg TINYINT NULL 

    ALTER TABLE [LegacyTable] 
    ADD improvedId INT NULL 
END 
GO 

IF NOT EXISTS(SELECT 1 FROM ImprovedTable WHERE legacyFlg = 1) 
BEGIN 

    MERGE ImprovedTable AS TARGET 
    USING LegacyTable AS SOURCE 
    ON (TARGET.stringField = SOURCE.stringField) 
    WHEN NOT MATCHED THEN 
     INSERT (name, <other columns>, legacyFlg) 
     VALUES('Legacy' + SOURCE.stringField, <other column values>, 1) 
    WHEN MATCHED THEN 
     UPDATE SET TARGET.legacyFlg = 1; 

END 
GO 

IF NOT EXISTS(SELECT 1 FROM LegacyTable WHERE improvedId <> 0) 
BEGIN 

    MERGE LegacyTable AS TARGET 
    USING NewImprovedTable AS SOURCE 
    ON (SOURCE.stringField = TARGET.stringField) 
    WHEN MATCHED THEN 
     UPDATE SET TARGET.improvedId = SOURCE.pId; 

END 
GO 
-1

你可以尝试使用此,其中“输入”是您要确认是否已经存在的字符串:

SELECT * FROM`NewImprovedTable` WHERE `Variable`='input' 

这将返回整行,如果发现任何匹配,如果没有也将返回null ,你可以用

至于玩,你需要创建一个自动增量选项启用表的主键的唯一ID字段,例如

CREATE TABLE Persons 
(
    P_Id INT NOT NULL AUTO_INCREMENT, 
    LastName varchar(255) NOT NULL, 
    FirstName varchar(255), 
    Address varchar(255), 
    City varchar(255), 
    PRIMARY KEY (P_Id) 
) 

在这最后例如P_Id被设置为一个自动增量变量,每当你创建一个新的行时,它都会自动填充一个唯一的数字。 您应该检查这个页面

http://www.w3schools.com/sql/sql_primarykey.asp

+1

你显然习惯于MySQL。其中一些语法在Oracle中无效,例如后退和自动增量。您也不应该使用数据类型varchar作为数据类型的工作方式在未来版本中可能会发生变化。 – Ben 2014-08-28 15:46:33

+0

ID字段已经设置为主键/标识,所以你是对的,它会自动增加任何一种方式。我会编辑我原来的帖子来澄清。我仍然需要将该ID保存回LegacyTable,但是我认为在将LegacyTable的数据复制到NewImprovedTable后,可以在第二个操作中处理该ID。 – pates 2014-08-28 16:03:16

相关问题