… 값에 삽입하십시오 (SELECT… FROM…)


1427

INSERT INTO다른 테이블의 입력을 사용하여 테이블을 만들려고 합니다. 이것은 많은 데이터베이스 엔진에서 전적으로 실현 가능하지만, 항상 엔진의 올바른 구문 SQL( MySQL , Oracle , SQL Server , InformixDB2 ) 을 기억하는 데 어려움을 겪고 있습니다.

기본 데이터베이스에 대해 걱정하지 않고 값을 삽입 할 수 있는 SQL 표준 (예 : SQL-92 ) 에서 나오는 은색 불릿 구문이 있습니까?


1
이 예제는 작동합니다 : tag_zone에 삽입 @ tag, zoneid, GETDATE (), @ positiong.STIntersects (polygon) 영역에서 선택
Uğur Gümüşhan

답변:


1611

시험:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2  

이것은 표준 ANSI SQL이며 모든 DBMS에서 작동해야합니다.

그것은 확실히 작동합니다 :

  • 신탁
  • MS SQL 서버
  • MySQL
  • 포스트그레스
  • SQLite v3
  • 테라 데이타
  • DB2
  • 사이베이스
  • 버티 카
  • HSQLDB
  • H2
  • AWS 레드 시프트
  • SAP HANA

947

Claude Houle의 답변 : 제대로 작동해야하며 여러 열과 다른 데이터도 가질 수 있습니다.

INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT  table2.column1, table2.column2, 8, 'some string etc.'
FROM    table2
WHERE   table2.ID = 7;

이 구문은 Access, SQL 2000 / 2005 / Express, MySQL 및 PostgreSQL에서만 사용되었으므로 이에 대해 다루어야합니다. SQLite3에서도 작동합니다.


1
where 조건이 table2.country로 변경되어 1보다 큰 행 수를 반환하면 어떻게됩니까? 여기 비슷한 문제를 가지고 : stackoverflow.com/questions/36030370/...
vijayrana

1
둘 이상의 행을 삽입하는 데 문제가 없어야합니다.
rinukkusu

테이블의 모든 열에 삽입해야합니다
maheshmnj

1
@maheshmnj 아니오, NOT NULL로 설정되고 기본값이없는 컬럼 만 포함되어야하며, 다른 컬럼은 디폴트 값 또는 NULL로 설정됩니다.
travis

정보 주셔서 감사합니다
maheshmnj

148

INSERT다른 테이블에서 다중 값으로 하나의 값만 얻으려면 SQLite3에서 다음을 수행했습니다.

INSERT INTO column_1 ( val_1, val_from_other_table ) 
VALUES('val_1', (SELECT  val_2 FROM table_2 WHERE val_2 = something))

4
명확히하기 위해 : 이것은 SQLite3에 대해 올바르지 않습니다. 에 따라 문서 의 소스 데이터가 INSERT있습니다 중 하나 VALUES 또는 SELECT성명, 둘.

2
문서에 나열되어 있지 않지만 작동하는 것은 사실입니다. 어쨌든 값 대신 select 문을 사용하면 더 읽기 쉽습니다.
Banjocat

1
행 내부의 값을 지정하는 데 효과적이지만 더 일반적인 경우 많은 행을 가져와야합니다.
Luchostein

val_1이 행에서 변경되지 않으면 SQLite3에서 다음 구문이 작동합니까? some_table에서 'foo', some_column을 선택하십시오-SQLServer 2014에서 작동
Chris B

문서는 (지금?)이 목록을 수행 :이 구문은 INSERT INTO ... VALUES ([expr], [expr], ...)에서가 경로 중 하나 [expr]입니다 {{NOT} EXISTS} ([select-stmt])- select 문 주위 paranthesis이 필요한 것을 메모 ( {}옵션 의미)
zapl

64

두 답변 모두 Informix에서 제대로 작동하며 기본적으로 표준 SQL입니다. 즉, 표기법 :

INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;

Informix와 잘 작동하며 모든 DBMS를 기대합니다. (5 년 또는 그 이전에, 이것은 MySQL이 항상 지원하지 않았던 종류입니다. 이제는 이러한 종류의 표준 SQL 구문을 지원하고 AFAIK는이 표기법에서 정상적으로 작동합니다.) 열 목록 선택 사항이지만 대상 열을 순서대로 표시하므로 SELECT 결과의 첫 번째 열이 나열된 첫 번째 열 등으로 이동합니다. 열 목록이없는 경우 SELECT 결과의 첫 번째 열은 목표 테이블의 첫 번째 열.

시스템마다 다른 점은 다른 데이터베이스에서 테이블을 식별하는 데 사용되는 표기법입니다. 표준은 데이터베이스 간 (DBMS 간) 작업에 대해서는 아무 말도하지 않습니다. Informix에서는 다음 표기법을 사용하여 테이블을 식별 할 수 있습니다.

[dbase[@server]:][owner.]table

즉, 데이터베이스를 지정하여 선택적으로 해당 데이터베이스가 현재 서버에없는 경우 해당 데이터베이스를 호스팅하는 서버를 식별 한 다음 선택적 소유자, 점 및 마지막으로 실제 테이블 이름을 지정할 수 있습니다. SQL 표준은 Informix가 소유자라고 부르는 것에 스키마라는 용어를 사용합니다. 따라서 Informix에서 다음 표기법 중 하나가 테이블을 식별 할 수 있습니다.

table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table

일반적으로 소유자는 인용 할 필요가 없습니다. 그러나 따옴표를 사용하는 경우 소유자 이름의 철자를 정확하게 입력해야합니다. 대소 문자를 구분합니다. 그건:

someone.table
"someone".table
SOMEONE.table

모두 같은 테이블을 식별합니다. Informix의 경우 소유자 ANSI 이름이 대문자로 변환되는 MODE ANSI 데이터베이스와 약간의 복잡성이 있습니다 (informix는 예외). 즉, 일반적으로 사용되지 않는 MODE ANSI 데이터베이스에서 다음을 작성할 수 있습니다.

CREATE TABLE someone.table ( ... )

시스템 카탈로그의 소유자 이름은 'someone'이 아닌 "SOMEONE"입니다. 소유자 이름을 큰 따옴표로 묶으면 구분 식별자처럼 작동합니다. 표준 SQL을 사용하면 구분 식별자를 여러 곳에서 사용할 수 있습니다. Informix를 사용하면 소유자 이름 주위에서만 사용할 수 있습니다. 다른 상황에서 Informix는 작은 따옴표로 묶은 문자열을 문자열로 구분하고 큰 따옴표로 묶은 문자열을 구분 식별자로 분리하는 대신 작은 따옴표와 큰 따옴표로 묶은 문자열을 문자열로 처리합니다. (물론, 완전성을 위해, 어떤 값으로도 설정할 수있는 환경 변수 DELIMIDENT가 있지만, Y가 가장 안전합니다. 큰 따옴표는 항상 구분 된 식별자를 둘러싸고 작은 따옴표는 항상 문자열을 둘러싸고 있음을 나타냅니다.)

MS SQL Server는 대괄호로 묶인 [구분 식별자]를 사용합니다. 그것은 이상하게 보이고 SQL 표준의 일부가 아닙니다.


40

다른 테이블의 레코드를 거의 원하지 않을 때 첫 번째 답변에 무언가를 추가하려면 (이 예제에서는 하나만) :

INSERT INTO TABLE1
(COLUMN1, COLUMN2, COLUMN3, COLUMN4) 
VALUES (value1, value2, 
(SELECT COLUMN_TABLE2 
FROM TABLE2
WHERE COLUMN_TABLE2 like "blabla"),
value4);

4
이 방법은 하나의 열만 선택되는 하위 쿼리에만 적용됩니다. 다중 열 하위 쿼리의 경우 '하위 쿼리는 하나의 열만 반환해야합니다'라는 오류가 발생합니다. 그렇다면 @travis의 답변을 채택하십시오.
snowfox

34

대부분의 데이터베이스는 기본 구문을 따릅니다.

INSERT INTO TABLE_NAME
SELECT COL1, COL2 ...
FROM TABLE_YOU_NEED_TO_TAKE_FROM
;

내가 즉이 구문에 따라 사용한 모든 데이터베이스, DB2, SQL Server, MY SQL,PostgresQL


34

쿼리 의 VALUES일부 대신 아래와 같이 쿼리를 INSERT사용하십시오 SELECT.

INSERT INTO table1 ( column1 , 2, 3... )
SELECT col1, 2, 3... FROM table2

32

하위 쿼리를 선택하여 삽입하는 두 가지 방법.

  1. SELECT 하위 쿼리를 사용하면 하나의 행 으로 결과를 반환합니다 .
  2. SELECT 하위 쿼리를 사용하면 여러 행 으로 결과를 반환합니다 .

1. SELECT 하위 쿼리를 사용하여 한 행 으로 결과를 반환하는 방법 .

INSERT INTO <table_name> (<field1>, <field2>, <field3>) 
VALUES ('DUMMY1', (SELECT <field> FROM <table_name> ),'DUMMY2');

이 경우 SELECT 하위 쿼리는 WHERE 조건 또는 SUM, MAX, AVG 등의 SQL 집계 함수를 기반으로 한 행의 결과 만 반환한다고 가정합니다. 그렇지 않으면 오류가 발생합니다.

2. SELECT 하위 쿼리를 사용하여 여러 행 으로 결과를 반환하는 방법 .

INSERT INTO <table_name> (<field1>, <field2>, <field3>) 
SELECT 'DUMMY1', <field>, 'DUMMY2' FROM <table_name>;

두 번째 방법은 두 경우 모두에 적용됩니다.


29

INSERT INTO부품의 모든 열에 값을 제공하는 경우 부품 의 열을 지정하지 않고 수행 할 수 있습니다 SELECT.

table1에 두 개의 열이 있다고 가정 해 봅시다. 이 쿼리는 작동해야합니다.

INSERT INTO table1
SELECT  col1, col2
FROM    table2

이 WOULD NOT 작동하지 않습니다 (에 대한 값 col2이 지정되지 않았습니다).

INSERT INTO table1
SELECT  col1
FROM    table2

MS SQL Server를 사용하고 있습니다. 다른 RDMS의 작동 방식을 모르겠습니다.


24

이것은 select와 함께 값을 사용하는 또 다른 예입니다.

INSERT INTO table1(desc, id, email) 
SELECT "Hello World", 3, email FROM table2 WHERE ...

오래된 대답이며 여전히 유용합니다. 매우 간단하고 명백하지만 내 요구를 정확하게 충족시킵니다. 감사!
Sebastian Kaczmarek

21

테이블 열 순서가 알려진 경우 간단한 삽입 :

    Insert into Table1
    values(1,2,...)

간단한 삽입 언급 열 :

    Insert into Table1(col2,col4)
    values(1,2)

테이블 (# table2)의 선택된 열 수가 삽입 테이블 (Table1)과 같은 경우 대량 삽입

    Insert into Table1 {Column sequence}
    Select * -- column sequence should be same.
       from #table2

원하는 테이블 열 (table1)에만 삽입하려는 경우 대량 삽입 :

    Insert into Table1 (Column1,Column2 ....Desired Column from Table1)  
    Select Column1,Column2..desired column from #table2
       from #table2

17

다음은 둘 이상의 테이블을 사용하여 소스를 가져 오는 또 다른 예입니다.

INSERT INTO cesc_pf_stmt_ext_wrk( 
  PF_EMP_CODE    ,
  PF_DEPT_CODE   ,
  PF_SEC_CODE    ,
  PF_PROL_NO     ,
  PF_FM_SEQ      ,
  PF_SEQ_NO      ,
  PF_SEP_TAG     ,
  PF_SOURCE) 
SELECT
  PFl_EMP_CODE    ,
  PFl_DEPT_CODE   ,
  PFl_SEC         ,
  PFl_PROL_NO     ,
  PF_FM_SEQ       ,
  PF_SEQ_NO       ,
  PFl_SEP_TAG     ,
  PF_SOURCE
 FROM cesc_pf_stmt_ext,
      cesc_pfl_emp_master
 WHERE pfl_sep_tag LIKE '0'
   AND pfl_emp_code=pf_emp_code(+);

COMMIT;

17

SELECT 절에 괄호를 사용 하여 INSERT하십시오. 예를 들면 다음과 같습니다.

INSERT INTO Table1 (col1, col2, your_desired_value_from_select_clause, col3)
VALUES (
   'col1_value', 
   'col2_value',
   (SELECT col_Table2 FROM Table2 WHERE IdTable2 = 'your_satisfied_value_for_col_Table2_selected'),
   'col3_value'
);

@Das 감사합니다 그것은 나를 위해 일하고 있습니다 ....
Raj G

16

여러 테이블에서 삽입하는 방법은 다음과 같습니다. 이 특정 예는 다 대다 시나리오에서 맵핑 테이블이있는 위치입니다.

insert into StudentCourseMap (StudentId, CourseId) 
SELECT  Student.Id, Course.Id FROM Student, Course 
WHERE Student.Name = 'Paddy Murphy' AND Course.Name = 'Basket weaving for beginners'

(학생 이름과 일치하면 하나 이상의 값을 반환 할 수 있지만 아이디어를 얻습니다. ID가 ID 열이고 알 수없는 경우 ID 이외의 항목과 일치해야합니다.)


14
INSERT INTO yourtable
SELECT fielda, fieldb, fieldc
FROM donortable;

이것은 모든 DBMS에서 작동합니다


14

SELECT * INTOtable을 사용하여 모든 열을 삽입하려는 경우이 작업을 시도 할 수 있습니다.

SELECT  *
INTO    Table2
FROM    Table1;

13

SQL Server 2008에서는 실제로 다음을 선호합니다.

SELECT Table1.Column1, Table1.Column2, Table2.Column1, Table2.Column2, 'Some String' AS SomeString, 8 AS SomeInt
INTO Table3
FROM Table1 INNER JOIN Table2 ON Table1.Column1 = Table2.Column3

삽입 () 세트를 추가하는 단계를 제거하고 테이블에 들어갈 값을 선택하기 만하면됩니다.


13

이것은 나를 위해 일했다 :

insert into table1 select * from table2

문장은 오라클과 약간 다릅니다.


12

Microsoft SQL Server의 경우 MSDN에서 제공되는 SYNTAX를 해석하는 방법을 배우는 것이 좋습니다. Google에서는 구문을 찾는 것이 그 어느 때보 다 쉬워졌습니다.

이 특별한 경우에는

Google : 사이트 삽입 : microsoft.com

첫 번째 결과는 http://msdn.microsoft.com/en-us/library/ms174335.aspx입니다.

페이지 맨 위에 제공된 구문을 해석하기 어려운 경우 예제 ( "SELECT 및 EXECUTE 옵션을 사용하여 다른 테이블에서 데이터 삽입")로 스크롤하십시오.

[ WITH <common_table_expression> [ ,...n ] ]
INSERT 
{
        [ TOP ( expression ) [ PERCENT ] ] 
        [ INTO ] 
        { <object> | rowset_function_limited 
          [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
        }
    {
        [ ( column_list ) ] 
        [ <OUTPUT Clause> ]
        { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n     ] 
        | derived_table       <<<<------- Look here ------------------------
        | execute_statement   <<<<------- Look here ------------------------
        | <dml_table_source>  <<<<------- Look here ------------------------
        | DEFAULT VALUES 
        }
    }
}
[;]

다른 RDBMS에도 적용 할 수 있습니다. 모든 제품 IMO에 대한 모든 구문을 기억할 필요는 없습니다.


나는 완전히 동의하지 않는다. 나는 몇 년 동안 그 구문을 살펴 봤지만 여전히 머리 나 꼬리를 만들 수는 없다. 예가 훨씬 더 유용합니다
레게 기타

이 대답은, 그것에 대해 그의 "는 문서를 읽기"말하는되지 않는다
reggaeguitar

12
INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT  COLUMN_NAME
FROM    ANOTHER_TABLE_NAME 
WHERE CONDITION;

@ggorlen 그것은 나에게 꽤 명백해 보인다
reggaeguitar

검토 대기열에 코드 전용 응답으로 표시되었습니다. 나는 당신의 요점을 여기서 볼 수 있습니다.이 페이지의 대부분의 답변과 관련하여 자연 환경에서 그것을보고 있기 때문에 말할 것도 많지 않습니다.
ggorlen

9
select *
into tmp
from orders

멋지게 보이지만 tmp가 존재하지 않는 경우에만 작동합니다 (만들고 채워짐). (SQL 서버)

기존 tmp 테이블에 삽입하려면 다음을 수행하십시오.

set identity_insert tmp on

insert tmp 
([OrderID]
      ,[CustomerID]
      ,[EmployeeID]
      ,[OrderDate]
      ,[RequiredDate]
      ,[ShippedDate]
      ,[ShipVia]
      ,[Freight]
      ,[ShipName]
      ,[ShipAddress]
      ,[ShipCity]
      ,[ShipRegion]
      ,[ShipPostalCode]
      ,[ShipCountry] )
      select * from orders

set identity_insert tmp off

9

다른 테이블에서 여러 레코드를 삽입하는 가장 좋은 방법입니다.

INSERT  INTO dbo.Users
            ( UserID ,
              Full_Name ,
              Login_Name ,
              Password
            )
            SELECT  UserID ,
                    Full_Name ,
                    Login_Name ,
                    Password
            FROM    Users_Table
            (INNER JOIN / LEFT JOIN ...)
            (WHERE CONDITION...)
            (OTHER CLAUSE)

2

INSERT VALUES 라우트에서 여러 행을 삽입하는 경우 괄호를 사용하여 VALUES를 세트로 구분해야합니다.

INSERT INTO `receiving_table`
  (id,
  first_name,
  last_name)
VALUES 
  (1002,'Charles','Babbage'),
  (1003,'George', 'Boole'),
  (1001,'Donald','Chamberlin'),
  (1004,'Alan','Turing'),
  (1005,'My','Widenius');

그렇지 않으면 "열 개수가 행 1의 값 개수와 일치하지 않습니다"라는 MySQL 객체가 생겨 마지막으로 조치를 취할 때 사소한 게시물을 작성하게됩니다.


6
문제는 " 다른 테이블 의 입력 사용하여 테이블에 삽입 "입니다. 귀하의 답변은이 질문을 어떻게 해결합니까?
품질 촉매

3
그에게 너무 열심히하지 마십시오. 내가 인터넷 검색을 할 때 내 질문에 대답했습니다. @QualityCatalyst
Cameron Belt

1

열 이름을 쓰지 않고 테이블에 일부 데이터를 삽입하려는 경우.

INSERT INTO CUSTOMER_INFO
   (SELECT CUSTOMER_NAME,
           MOBILE_NO,
           ADDRESS
      FROM OWNER_INFO cm
     WHERE ID>100)

테이블이있는 곳 :

            CUSTOMER_INFO               ||            OWNER_INFO
----------------------------------------||-------------------------------------
CUSTOMER_NAME | MOBILE_NO | ADDRESS     || CUSTOMER_NAME | MOBILE_NO | ADDRESS 
--------------|-----------|---------    || --------------|-----------|--------- 
      A       |     +1    |   DC        ||       B       |     +55   |   RR  

결과:

            CUSTOMER_INFO               ||            OWNER_INFO
----------------------------------------||-------------------------------------
CUSTOMER_NAME | MOBILE_NO | ADDRESS     || CUSTOMER_NAME | MOBILE_NO | ADDRESS 
--------------|-----------|---------    || --------------|-----------|--------- 
      A       |     +1    |   DC        ||       B       |     +55   |   RR
      B       |     +55   |   RR        ||


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.