SQL에서 테이블의 모든 값을 다른 테이블에 삽입


128

한 테이블의 모든 값을 다른 테이블에 삽입하려고합니다. 그러나 insert 문은 값을 허용하지만 initial_Table에서 select *를 수락하고 싶습니다. 이게 가능해?

답변:


262

insert 문은 실제로 그렇게하기위한 구문을 가지고 있습니다. "*"를 선택하지 않고 열 이름을 지정하면 훨씬 쉽습니다.

INSERT INTO new_table (Foo, Bar, Fizz, Buzz)
SELECT Foo, Bar, Fizz, Buzz
FROM initial_table
-- optionally WHERE ...

어떤 이유로 든이 게시물에 몇 개의 투표권이 부여되기 때문에 이것을 분명히하는 것이 좋습니다.

INSERT INTO ... SELECT FROM 구문은 삽입하려는 테이블 (위의 예제에서 "new_table")이 이미 존재하는 경우입니다. 다른 사람들이 말했듯이 SELECT ... INTO 구문은 명령의 일부로 새 테이블을 만들 때 사용됩니다.

새 테이블을 명령의 일부로 작성해야하는지 여부를 지정하지 않았으므로 대상 테이블이 이미 존재하면 INSERT INTO ... SELECT FROM이 적합해야합니다.


3
뭐? 누군가이 게시물이 다운 투표를하는 이유를 설명하는 의견을 남기고 싶습니까? OPs 질문에 새 테이블을 쿼리의 일부로 생성하도록 지정하는 내용이 없습니다.
매트 해밀턴

무결성 제약 위반을 어떻게 처리합니까? 예를 들어, 고유 항목이 중복 된 경우 쿼리를 중지하거나 해당 특정 항목을 건너 뛰나요?
Martin Dale Lyness

오류가 발생하고 트랜잭션을 롤백한다고 믿어 아무것도 복사되지 않습니다. 그래도 테스트 할 가치가 있습니다.
매트 해밀턴

25

이 시도:

INSERT INTO newTable SELECT * FROM initial_Table

2
ID 열이있을 때 별을 사용할 때 작동하지 않음
Mohsen

ID가있는이 시나리오의 경우 ID ID를 삽입하려면 먼저 SET IDENTITY_INSERT table_name을 ON으로 설정하고 마지막에 off를 추가하십시오.
Juan

13

다음과 같이 하위 쿼리를 사용하여 삽입 할 수 있습니다.

INSERT INTO new_table (columns....)
SELECT columns....
FROM initial_table where column=value



4

코드를 입력하지 않아도되는 쉬운 방법이 있습니다 (테스트에 적합하거나 일회성 업데이트).

1 단계

  • 탐색기에서 테이블을 마우스 오른쪽 버튼으로 클릭하고 "상위 100 개 행 편집"을 선택하십시오.

2 단계

  • 그런 다음 원하는 행을 선택하고 ( Ctrl + Click 또는 Ctrl + A ) 마우스 오른쪽 버튼을 클릭하고 복사하십시오 ( 참고 : " where "조건 을 추가 하려면 그리드-> 창-> SQL을 마우스 오른쪽 버튼으로 클릭하십시오. 쿼리를 편집하고 WHERE 조건을 추가 한 다음 마우스 오른쪽 버튼을 다시 클릭-> SQL 실행하면 필요한 행을 맨 아래에서 선택할 수 있습니다)

3 단계

  • 대상 테이블에 대해 1 단계를 수행하십시오.

4 단계

  • 이제 그리드의 끝으로 가면 마지막 행의 첫 번째 열에 별표 (*) 가 표시됩니다 (이 행은 새 항목을 추가하는 것입니다). 클릭하여 전체 행을 선택한 다음 PASTE ( Ctrl + V )를 클릭하십시오. 셀에 빨간색 별표가있을 수 있습니다 (저장되지 않았 음을 나타냄)

5 단계

  • 다른 행을 클릭하면 insert 문이 트리거됩니다 (Red Asterix가 사라짐)

참고-1 : 열이 대상 테이블에서와 같이 올바른 순서가 아닌 경우 항상 2 단계를 수행하고 대상 테이블에서와 동일한 순서로 열을 선택할 수 있습니다

알아두기-2- 아이디 열이있는 경우 SET IDENTITY_INSERT sometableWithIdentity ON위 단계 를 실행 한 다음 실행 하십시오.SET IDENTITY_INSERT sometableWithIdentity OFF


3

임시 테이블을 채우지 않는 등 많은 데이터를 영구적으로 전송하는 경우 테이블 간 매핑에 SQL Server 가져 오기 / 내보내기 데이터 를 사용하는 것이 좋습니다 .

가져 오기 / 내보내기 도구는 일반적으로 매핑에서 유형 변환 및 가능한 값 잘림이있는 경우 일반 SQL보다 낫습니다. 일반적으로 매핑이 복잡할수록 직접 SQL 대신 SSIS (Integration Services)와 같은 ETL 도구를 사용하면 생산성이 높아집니다.

가져 오기 / 내보내기 도구는 실제로 SSIS 마법사이며 작업을 dtsx 패키지로 저장할 수 있습니다.


2

나는이 진술이 당신이 원하는 것을 할 수 있다고 생각합니다.

INSERT INTO newTableName (SELECT column1, column2, column3 FROM oldTable);

0
 Dim ofd As New OpenFileDialog
                ofd.Filter = "*.mdb|*.MDB"
                ofd.FilterIndex = (2)
                ofd.FileName = "bd1.mdb"
                ofd.Title = "SELECCIONE LA BASE DE DATOS ORIGEN (bd1.mdb)"
                ofd.ShowDialog()
                Dim conexion1 = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + ofd.FileName
                Dim conn As New OdbcConnection()
                conn.ConnectionString = conexion1
                conn.Open()



            'EN ESTE CODIGO SOLO SE AGREGAN LOS DATOS'
            Dim ofd2 As New OpenFileDialog
            ofd2.Filter = "*.mdb|*.MDB"
            ofd2.FilterIndex = (2)
            ofd2.FileName = "bd1.mdb"
            ofd2.Title = "SELECCIONE LA BASE DE DATOS DESTINO (bd1.mdb)"
            ofd2.ShowDialog()
            Dim conexion2 = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + ofd2.FileName
            Dim conn2 As New OdbcConnection()
            conn2.ConnectionString = conexion2
            Dim cmd2 As New OdbcCommand
            Dim CADENA2 As String

            CADENA2 = "INSERT INTO EXISTENCIA IN '" + ofd2.FileName + "' SELECT * FROM EXISTENCIA IN '" + ofd.FileName + "'"


            cmd2.CommandText = CADENA2
            cmd2.Connection = conn2
            conn2.Open()
            Dim dA2 As New OdbcDataAdapter
            dA2.SelectCommand = cmd2
            Dim midataset2 As New DataSet
            dA2.Fill(midataset2, "EXISTENCIA")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.