2014-08-28 3 views
0

아래에 설명 된 alter 스크립트를 구현하는 방법을 알아 내려고하고 있습니다. 삽입/선택을하면 기본에 익숙하지만 훨씬 더 복잡합니다.SQL 변경 스크립트 - 한 테이블에서 다른 테이블로 복사

레거시 테이블이있어서 데이터를 더 많은 열이있는 새 테이블로 옮길 필요가 있습니다. 새 테이블은 일부 일반 사용자에게 공개되어 이미 수동으로 공용 데이터를 이동했을 수 있습니다. LegacyTable 각 행에 대해 그래서

:

  • 은 이미
  • 없는 경우 (두 테이블에 존재하는 문자열 필드에 일치를 확인하여) NewImprovedTable에 존재하는 경우, 참조 자사를 통해 복사 NewImprovedTable 관계없이 사용자가 자동으로 지금 막, 또는 이전에 NewImprovedTable로 복사했는지의
  • ...
    • NewImprovedTable의 새로운 이름 필드 (고유해야합니다 자동으로 채울 - 예 : "Legacy1", "Legacy2 ", 등)
    • 내가 MS SQL 및 Oracle 모두에서이를 구현해야합니다,하지만 난 하나에 논리를 해결하면 나는에 구문을 알아낼 수 NewImprovedTable

에 IsLegacy 플래그를 설정 다른.

+1

나에게 소리 너를 찾아라. – tilley31

답변

0

난에 정착 솔루션을 확인해야합니다 (SQL 서버에 여전히 오라클 포트에 필요) : MERGE 문이 방식은 같은

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

당신은 '입력'이미 존재하는 경우 확인하려고하는 문자열 곳, 사용하여 시도 할 수 있습니다 : 어떤 경기를 발견 아닌 경우는 NULL을 반환 할 경우

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) 
) 

를 들어, 자동 증가 옵션을 활성화하여 테이블에 기본 키를 만들 필요가 고유 ID 필드에 그

으로 함께 재생할 수 있습니다 예 P_Id는 자동 증가 변수로 설정됩니다. 새 행을 만들 때마다이 열을 고유 번호로 자동 채 웁니다. - 이 페이지

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

+1

당신은 분명 MySQL에 익숙합니다. Oracle에서이 구문 중 일부는 유효하지 않습니다 (예 : 역 틱 및 자동 증가). 또한 데이터 유형 varchar의 데이터 유형을 향후 버전에서 변경 될 수 있으므로 사용하지 않아야합니다. – Ben

+0

ID 필드는 이미 기본 키/ID로 설정되어 있으므로 자동으로 증가합니다. 내가 명확히하기 위해 원본 게시물을 수정하겠습니다. 그 ID를 LegacyTable에 다시 저장해야하지만, LegacyTable의 데이터를 NewImprovedTable에 복사 한 후 두 번째 작업에서 처리 할 수 ​​있다고 가정합니다. – pates