[SQL] 다른 하나 개의 테이블에서 SQL 데이터를 이동
SQL다른 하나 개의 테이블에서 SQL 데이터를 이동
나는 특정 쿼리와 일치하는 또 다른 하나 개의 테이블에서 데이터의 모든 행을 이동할 수 있습니다 경우 궁금 해서요?
예를 들어, 내가 표에서 사용자 이름 = 'X'와 암호 = 'X'는, 그래서 그들은 더 이상 표에 표시됩니다 표 2에 모든 테이블 행을 이동해야합니다.
나는 SQL 서버 2008 Management Studio를 사용하고 있습니다.
해결법
-
==============================
1.하나의 트랜잭션, 삽입 및 삭제 내에서 두 개의 문을 사용 할 수 있어야한다 :
하나의 트랜잭션, 삽입 및 삭제 내에서 두 개의 문을 사용 할 수 있어야한다 :
INSERT INTO Table2 (<columns>) SELECT <columns> FROM Table1 WHERE <condition>; DELETE FROM Table1 WHERE <condition>; COMMIT;
이것은 가장 간단한 형태입니다. 당신이 두 문 사이에 표에 삽입되는 새로운 일치하는 레코드에 대해 걱정할 필요가 있다면, 당신은을 추가하고 <의 표 2> 존재 할 수 있습니다.
-
==============================
2.이 미안, 고대의 게시물입니다,하지만 난 단지 지금을 가로 질러 와서 나는이 일일 우연히 있습니다 누구든지 내 솔루션을 제공하고 싶었다.
이 미안, 고대의 게시물입니다,하지만 난 단지 지금을 가로 질러 와서 나는이 일일 우연히 있습니다 누구든지 내 솔루션을 제공하고 싶었다.
일부는 언급 한 바와 같이, INSERT하고 무결성 문제로 삭제 될 수 있습니다 리드, 그것을 해결하기 위해, 단일 성명에서 깔끔하게 모든 것을 수행 할 수 있도록 아마 방법을 수행의 [삭제] 임시 테이블을 활용하는 것입니다.
DELETE FROM [source] OUTPUT [deleted].<column_list> INTO [destination] (<column_list>)
-
==============================
3.이 모든 답은 INSERT 및 DELETE에 대해 동일한 쿼리를 실행합니다. 앞서 언급 한 바와 같이,이 문 사이에 삽입 기록까지 삭제 따기 위험하고 쿼리 (영리 엔진 있지만 빠른 두 번째 전화를 걸 "한다") 복잡한 경우 느려질 수 있습니다.
이 모든 답은 INSERT 및 DELETE에 대해 동일한 쿼리를 실행합니다. 앞서 언급 한 바와 같이,이 문 사이에 삽입 기록까지 삭제 따기 위험하고 쿼리 (영리 엔진 있지만 빠른 두 번째 전화를 걸 "한다") 복잡한 경우 느려질 수 있습니다.
올바른 방법 (삽입 가정은 새로운 테이블에있다) 표 2의 키 필드를 사용하여 DELETE에 대한의 표를하는 것입니다.
삭제는해야한다 :
DELETE FROM tbl_OldTableName WHERE id in (SELECT id FROM tbl_NewTableName)
내 구문을 실례합니다, 나는 엔진 사이의 점프를 해요하지만 당신은 아이디어를 얻을.
-
==============================
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.어떤 다른 답변의 청소기 표현은 암시했다 :
어떤 다른 답변의 청소기 표현은 암시했다 :
DELETE sourceTable OUTPUT DELETED.* INTO destTable (Comma, separated, list, of, columns) WHERE <conditions (if any)>
-
==============================
6.이 시도
이 시도
INSERT INTO TABLE2 (Cols...) SELECT Cols... FROM TABLE1 WHERE Criteria
그때
DELETE FROM TABLE1 WHERE Criteria
-
==============================
7.당신은 INSERT 문에서 하위 쿼리와 함께 할 수 있어야한다.
당신은 INSERT 문에서 하위 쿼리와 함께 할 수 있어야한다.
INSERT INTO table1(column1, column2) SELECT column1, column2 FROM table2 WHERE ...;
표에서 삭제 하였다.
아무것도 잘못되면 당신은 전체 작업 등을 롤백 할 수 있도록 단일 트랜잭션으로 실행해야합니다.
-
==============================
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.당신이 시도 할 수 :
당신이 시도 할 수 :
SELECT * INTO tbl_NewTableName FROM tbl_OldTableName WHERE Condition1=@Condition1Value
그런 다음 기본 삭제를 실행합니다 :
DELETE FROM tbl_OldTableName WHERE Condition1=@Condition1Value
-
==============================
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.당신은 테이블간에 데이터를 전환하는 "논리 파티션"을 사용할 수 있습니다 :
당신은 테이블간에 데이터를 전환하는 "논리 파티션"을 사용할 수 있습니다 :
파티션 열을 업데이트하여, 데이터는 자동으로 다른 테이블로 이동합니다 :
여기에 샘플입니다 :
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.두 테이블은 동일한 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.그것은 테이블을 만들고 새 테이블로 이전 테이블의 모든 데이터를 복사합니다
그것은 테이블을 만들고 새 테이블로 이전 테이블의 모든 데이터를 복사합니다
event_log FROM SELECT * INTO의 event_log_temp
그리고 당신은 이전 테이블의 데이터를 지울 수 있습니다.
event_log에서 삭제
from https://stackoverflow.com/questions/1612267/move-sql-data-from-one-table-to-another by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 가장 최근의 기록을 검색하는 SQL 쿼리를 작성 (0) | 2020.05.08 |
---|---|
[SQL] 임의의 날짜 행을 업데이트하는 방법 (0) | 2020.05.08 |
[SQL] SQL에서 UPDATE가 DELETE +의 INSERT보다 항상 빠른? (0) | 2020.05.08 |
[SQL] MySQL은 - 방법은 문자열의 일부를 업데이트하려면? (0) | 2020.05.08 |
[SQL] 어떻게 포스트 그레스 SELECT의 열을 연결하는? (0) | 2020.05.08 |