2014-08-28 5 views
0

Я пытаюсь понять, как реализовать скрипт alter, описанный ниже. Я знаком с основами, если вставить/выбрать уже, но это намного сложнее.SQL alter script - копирование из одной таблицы в другую

У меня есть таблица устаревших данных и вам нужно переместить свои данные в новую таблицу с большим количеством столбцов. Новая таблица уже была опубликована для некоторых избранных пользователей, которые, возможно, уже вручную переместили общие данные.

Таким образом, для каждой строки в LegacyTable:

  • посмотреть, если он уже существует в NewImprovedTable (путем проверки матча на поле строки, которая существует в обеих таблицах)
  • если нет, то скопируйте его к NewImprovedTable
  • независимо от того, был ли он был скопирован NewImprovedTable автоматически только сейчас, или ранее пользователем ...
    • автоматического заполнения новое имя поля в NewImprovedTable (должно быть уникальным - например, «Legacy1», «Legacy2 », и т.д.)
    • установлен флаг IsLegacy в NewImprovedTable

Мне нужно реализовать это как в MS SQL и Oracle, но когда я работаю на логику, которую я могу понять, синтаксис Другие.

+1

Звуки для меня, как заявление MERGE является способ пойдите для вас. – tilley31

ответ

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' 

Это вернет всю строку, если найдено ни одного матча, если не вернет нуль вы можете играть с этим

что касается уникального идентификационного поля необходимо создать первичный ключ на столе с включить опцию автоматического приращения, например

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

+0

Поле идентификатора уже настроено как первичный ключ/идентификатор, поэтому вы правы, он будет автоматически увеличиваться в любом случае. Я отредактирую свое оригинальное сообщение, чтобы уточнить. Мне все равно нужно сохранить этот идентификатор обратно в LegacyTable, но я полагаю, что это можно было бы обработать во второй операции после того, как данные из LegacyTable будут скопированы в NewImprovedTable. – pates