복붙노트

[SQL] 다른 하나 개의 테이블에서 SQL 데이터를 이동

SQL

다른 하나 개의 테이블에서 SQL 데이터를 이동

나는 특정 쿼리와 일치하는 또 다른 하나 개의 테이블에서 데이터의 모든 행을 이동할 수 있습니다 경우 궁금 해서요?

예를 들어, 내가 표에서 사용자 이름 = 'X'와 암호 = 'X'는, 그래서 그들은 더 이상 표에 표시됩니다 표 2에 모든 테이블 행을 이동해야합니다.

나는 SQL 서버 2008 Management Studio를 사용하고 있습니다.

해결법

  1. ==============================

    1.하나의 트랜잭션, 삽입 및 삭제 내에서 두 개의 문을 사용 할 수 있어야한다 :

    하나의 트랜잭션, 삽입 및 삭제 내에서 두 개의 문을 사용 할 수 있어야한다 :

    INSERT INTO Table2 (<columns>)
    SELECT <columns>
    FROM Table1
    WHERE <condition>;
    
    DELETE FROM Table1
    WHERE <condition>;
    
    COMMIT;
    

    이것은 가장 간단한 형태입니다. 당신이 두 문 사이에 표에 삽입되는 새로운 일치하는 레코드에 대해 걱정할 필요가 있다면, 당신은을 추가하고 <의 표 2> 존재 할 수 있습니다.

  2. ==============================

    2.이 미안, 고대의 게시물입니다,하지만 난 단지 지금을 가로 질러 와서 나는이 일일 우연히 있습니다 누구든지 내 솔루션을 제공하고 싶었다.

    이 미안, 고대의 게시물입니다,하지만 난 단지 지금을 가로 질러 와서 나는이 일일 우연히 있습니다 누구든지 내 솔루션을 제공하고 싶었다.

    일부는 언급 한 바와 같이, INSERT하고 무결성 문제로 삭제 될 수 있습니다 리드, 그것을 해결하기 위해, 단일 성명에서 깔끔하게 모든 것을 수행 할 수 있도록 아마 방법을 수행의 [삭제] 임시 테이블을 활용하는 것입니다.

    DELETE FROM [source]
    OUTPUT [deleted].<column_list>
    INTO [destination] (<column_list>)
    
  3. ==============================

    3.이 모든 답은 INSERT 및 DELETE에 대해 동일한 쿼리를 실행합니다. 앞서 언급 한 바와 같이,이 문 사이에 삽입 기록까지 삭제 따기 위험하고 쿼리 (영리 엔진 있지만 빠른 두 번째 전화를 걸 "한다") 복잡한 경우 느려질 수 있습니다.

    이 모든 답은 INSERT 및 DELETE에 대해 동일한 쿼리를 실행합니다. 앞서 언급 한 바와 같이,이 문 사이에 삽입 기록까지 삭제 따기 위험하고 쿼리 (영리 엔진 있지만 빠른 두 번째 전화를 걸 "한다") 복잡한 경우 느려질 수 있습니다.

    올바른 방법 (삽입 가정은 새로운 테이블에있다) 표 2의 키 필드를 사용하여 DELETE에 대한의 표를하는 것입니다.

    삭제는해야한다 :

    DELETE FROM tbl_OldTableName WHERE id in (SELECT id FROM tbl_NewTableName)
    

    내 구문을 실례합니다, 나는 엔진 사이의 점프를 해요하지만 당신은 아이디어를 얻을.

  4. ==============================

    4.예 그렇습니다. 첫 번째 INSERT + SELECT 다음 DELETE 원본.

    예 그렇습니다. 첫 번째 INSERT + SELECT 다음 DELETE 원본.

    INSERT INTO Table2 (UserName,Password)
    SELECT UserName,Password FROM Table1 WHERE UserName='X' AND Password='X'
    

    다음 삭제 원본

    DELETE FROM Table1 WHERE UserName='X' AND Password='X'
    

    당신은 사용자 ID 또는 someother 기본 키, 다음 키를 보존하기 위해 IDENTITY INSERT를 사용하여 보존 할 수 있습니다.

    MSDN에 SET IDENTITY_INSERT에 대한 자세한 참조

  5. ==============================

    5.어떤 다른 답변의 청소기 표현은 암시했다 :

    어떤 다른 답변의 청소기 표현은 암시했다 :

    DELETE sourceTable
    OUTPUT DELETED.*
    INTO destTable (Comma, separated, list, of, columns)
    WHERE <conditions (if any)>
    
  6. ==============================

    6.이 시도

    이 시도

    INSERT INTO TABLE2 (Cols...) SELECT Cols... FROM TABLE1 WHERE Criteria
    

    그때

    DELETE FROM TABLE1 WHERE Criteria
    
  7. ==============================

    7.당신은 INSERT 문에서 하위 쿼리와 함께 할 수 있어야한다.

    당신은 INSERT 문에서 하위 쿼리와 함께 할 수 있어야한다.

    INSERT INTO table1(column1, column2) SELECT column1, column2 FROM table2 WHERE ...;
    

    표에서 삭제 하였다.

    아무것도 잘못되면 당신은 전체 작업 등을 롤백 할 수 있도록 단일 트랜잭션으로 실행해야합니다.

  8. ==============================

    8.커밋 / 롤백을 여러 문장으로 안전 없음 필요가있다이 하나의 SQL 문을 사용합니다.

    커밋 / 롤백을 여러 문장으로 안전 없음 필요가있다이 하나의 SQL 문을 사용합니다.

    INSERT Table2 (
          username,password
    ) SELECT username,password
          FROM    (
               DELETE Table1
               OUTPUT
                       DELETED.username,
                       DELETED.password
               WHERE username = 'X' and password = 'X'
          ) AS RowsToMove ;
    

    SQL 서버의 작품은 MySQL 용 적절하게 변경합니다

  9. ==============================

    9.당신이 시도 할 수 :

    당신이 시도 할 수 :

    SELECT * INTO tbl_NewTableName 
    FROM tbl_OldTableName
    WHERE Condition1=@Condition1Value
    

    그런 다음 기본 삭제를 실행합니다 :

    DELETE FROM tbl_OldTableName
    WHERE Condition1=@Condition1Value
    
  10. ==============================

    10.여기에 하나의 문으로 그것을 할 방법입니다

    여기에 하나의 문으로 그것을 할 방법입니다

    WITH deleted_rows AS (
    DELETE FROM source_table WHERE id = 1
    RETURNING *
    ) 
    INSERT INTO destination_table 
    SELECT * FROM deleted_rows;
    

    예:

        postgres=# select * from test1 ;
     id |  name
    ----+--------
      1 | yogesh
      2 | Raunak
      3 | Varun
    (3 rows)
    
    
    postgres=# select * from test2;
     id | name
    ----+------
    (0 rows)
    
    
    postgres=# WITH deleted_rows AS (
    postgres(# DELETE FROM test1 WHERE id = 1
    postgres(# RETURNING *
    postgres(# )
    postgres-# INSERT INTO test2
    postgres-# SELECT * FROM deleted_rows;
    INSERT 0 1
    
    
    postgres=# select * from test2;
     id |  name
    ----+--------
      1 | yogesh
    (1 row)
    
    postgres=# select * from test1;
     id |  name
    ----+--------
      2 | Raunak
      3 | Varun
    
  11. ==============================

    11.당신은 테이블간에 데이터를 전환하는 "논리 파티션"을 사용할 수 있습니다 :

    당신은 테이블간에 데이터를 전환하는 "논리 파티션"을 사용할 수 있습니다 :

    파티션 열을 업데이트하여, 데이터는 자동으로 다른 테이블로 이동합니다 :

    여기에 샘플입니다 :

    CREATE TABLE TBL_Part1
    (id  INT NOT NULL,
     val VARCHAR(10) NULL,
     PartitionColumn  VARCHAR(10) CONSTRAINT CK_Part1 CHECK(PartitionColumn = 'TBL_Part1'),
     CONSTRAINT TBL_Part1_PK PRIMARY KEY(PartitionColumn, id)
    );
    
    CREATE TABLE TBL_Part2
    (id  INT NOT NULL,
     val VARCHAR(10) NULL,
     PartitionColumn  VARCHAR(10) CONSTRAINT CK_Part2 CHECK(PartitionColumn = 'TBL_Part2'),
     CONSTRAINT TBL_Part2_PK  PRIMARY KEY(PartitionColumn, id)
    );
    
    GO
    
    CREATE VIEW TBL(id, val, PartitionColumn)
    WITH SCHEMABINDING
    AS
         SELECT id, val, PartitionColumn FROM dbo.TBL_Part1
         UNION ALL  
         SELECT id, val, PartitionColumn FROM dbo.TBL_Part2;
    
    GO
    
    --Insert sample to TBL ( will be inserted to Part1 )
    INSERT INTO TBL
    VALUES(1, 'rec1', 'TBL_Part1');
    
    INSERT INTO TBL
    VALUES(2, 'rec2', 'TBL_Part1');
    
    GO
    
    --Query sub table to verify
    SELECT * FROM TBL_Part1
    
    GO
    --move the data to table TBL_Part2 by Logical Partition switching technique
    UPDATE TBL
      SET
          PartitionColumn = 'TBL_Part2';
    
    GO
    
    --Query sub table to verify
    SELECT * FROM TBL_Part2
    
  12. ==============================

    12.두 테이블은 동일한 ID를 사용하거나 공통의 UNIQUE 키가있는 경우 :

    두 테이블은 동일한 ID를 사용하거나 공통의 UNIQUE 키가있는 경우 :

    1) 표 2의 선택된 레코드를 삽입

    INSERT INTO table2 SELECT * FROM table1 WHERE (conditions)
    

    2) 표 1에서 선택한 레코드를 삭제하면 표 2에서 선물

    DELETE FROM table1 as A, table2 as B WHERE (A.conditions) AND  (A.ID = B.ID)
    
  13. ==============================

    13.그것은 테이블을 만들고 새 테이블로 이전 테이블의 모든 데이터를 복사합니다

    그것은 테이블을 만들고 새 테이블로 이전 테이블의 모든 데이터를 복사합니다

    event_log FROM SELECT * INTO의 event_log_temp

    그리고 당신은 이전 테이블의 데이터를 지울 수 있습니다.

    event_log에서 삭제

  14. from https://stackoverflow.com/questions/1612267/move-sql-data-from-one-table-to-another by cc-by-sa and MIT license