SQL alter script - 从一个表复制到另一个表

时间:2014-08-28 15:09:05

标签: sql oracle copy

我试图弄清楚如何实现下面描述的alter脚本。如果已经插入/选择,我熟悉基础知识,但这要复杂得多。

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

因此对于LegacyTable中的每一行:

  • 查看它是否已存在于NewImprovedTable中(通过检查两个表中存在的字符串字段的匹配项)
  • 如果没有,请将其复制到NewImprovedTable
  • 无论是刚刚自动复制到NewImprovedTable还是先前由用户复制到...
    • 在NewImprovedTable中自动填充新的名称字段(必须是唯一的 - 例如" Legacy1"," Legacy2"等等)
    • 在NewImprovedTable中设置IsLegacy标志

我需要在MS SQL和Oracle中实现这一点,但是一旦我在逻辑上计算出逻辑,我就可以在另一个上找出语法。

2 个答案:

答案 0 :(得分: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 :(得分:-1)

你可以试试这个,输入&#39;是您尝试确认的字符串是否已存在:

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