문제

나는 노력하고있다 INSERT INTO 다른 테이블의 입력을 사용한 테이블. 이것은 많은 데이터베이스 엔진에 대해 전적으로 실현 가능하지만, 나는 항상 올바른 구문을 기억하는 데 어려움을 겪고있는 것 같습니다. SQL 오늘의 엔진 (MySQL, 신탁, SQL 서버, 정보, 그리고 DB2).

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

도움이 되었습니까?

해결책

노력하다:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2  

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

확실히 다음과 같습니다.

  • 신탁
  • MS SQL Server
  • MySQL
  • 포스트 그레
  • sqlite v3
  • 테라 다다
  • DB2
  • Sybase
  • VERTICA
  • HSQLDB
  • H2
  • AWS 적색 편이
  • SAP HANA

다른 팁

@섀도우 _x99: 제대로 작동해야하며 여러 열 및 기타 데이터도 가질 수도 있습니다.

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에서 작동 할 것이라고 지적했다.

다중 값으로 하나의 값만 얻습니다 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))

내가 보는 두 가지 답은 구체적으로 Informix에서 잘 작동하며 기본적으로 표준 SQL입니다. 즉, 표기법 :

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

Informix와 함께 잘 작동하며 모든 DBM을 기대합니다. (5 년 전, 이것은 MySQL이 항상 지원하지 않은 일종의 것입니다. 이제는 이런 종류의 표준 SQL 구문에 대한 괜찮은 지원을 받았으며 Afaik 은이 표기법에서 잘 작동합니다.) 열 목록은 열 목록입니다. 선택 사항이지만 대상 열을 순서대로 표시하므로 SELECT의 첫 번째 열은 첫 번째 열거 된 열 등으로 이동합니다. 열 목록이없는 경우 SELECT의 첫 번째 열은 대상 테이블의 첫 번째 열.

시스템간에 다른 방법은 다른 데이터베이스에서 테이블을 식별하는 데 사용되는 표기법입니다. 표준은 Database (DBMS 간) 작업에 대해 말할 것이 없습니다. Informix를 사용하면 다음 표기법을 사용하여 테이블을 식별 할 수 있습니다.

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

즉, 데이터베이스를 지정하여 현재 서버가 아닌 경우 해당 데이터베이스를 호스팅하는 서버를 선택적으로 식별하고 선택적 소유자, DOT 및 실제 테이블 이름을 선택할 수 있습니다. 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를 사용하면 Mode ANSI 데이터베이스에 가벼운 합병증이 있으며, 여기서 소유자 이름은 일반적으로 상단 사례로 변환됩니다 (Informix는 예외입니다). 즉, 모드 ANSI 데이터베이스 (일반적으로 사용되지 않음)에서는 다음을 작성할 수 있습니다.

CREATE TABLE someone.table ( ... )

그리고 시스템 카탈로그의 소유자 이름은 '누군가'가 아닌 "누군가"가 될 것입니다. 소유자 이름을 이중 인용문으로 동봉하면 구분 된 식별자처럼 작동합니다. 표준 SQL을 사용하면 구분 식별자가 여러 곳에서 사용할 수 있습니다. Informix를 사용하면 소유자 이름 주변에서만 사용할 수 있습니다. 다른 상황에서는 단일 크기의 문자열을 문자열로 분리하는 대신 단일 인용 및 이중 인용 문자열을 문자열로 취급하고 구분 식별자로서 두 배로 인용 된 문자열을 사용할 수 있습니다. (물론, 완전성을 위해서는 환경 변수가 있고, 영리 적이며, 어떤 값 으로든 설정할 수 있지만 y는 가장 안전합니다. 이중 인용문은 항상 구분 된 식별자와 단일 따옴표가 항상 문자열을 둘러싸고 있음을 나타냅니다.)

MS SQL Server는 정사각형 브래킷으로 동봉 된 [구분 식별자]를 사용합니다. 그것은 나에게 이상하게 보이며 확실히 SQL 표준의 일부는 아닙니다.

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

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

내가 사용한 모든 데이터베이스는이 구문을 따릅니다. DB2, SQL Server, MY SQL, PostgresQL

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

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

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

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

INSERT INTO table1
SELECT  col1, col2
FROM    table2

이것은 작동하지 않습니다 (가치 col2 지정되지 않음) :

INSERT INTO table1
SELECT  col1
FROM    table2

MS SQL Server를 사용하고 있습니다. 다른 RDM이 어떻게 작동하는지 모르겠습니다.

대신에 VALUES 부분의 INSERT 쿼리, 그냥 사용하십시오 SELECT 아래와 같이 쿼리.

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

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

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

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

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

칼럼을 언급 한 간단한 삽입 :

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

테이블의 선택된 열 수 (#표 2)가 삽입 테이블과 같을 때 벌크 삽입 (표 1)

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

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

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

다음은 하나 이상의 테이블을 사용하여 소스를 촬영하는 또 다른 예입니다.

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;

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

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 이외의 다른 것에 일치하는 것이 필요합니다.)

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

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

사용하여 모든 열을 삽입하려면 시도해 볼 수 있습니다. SELECT * INTO 테이블.

SELECT  *
INTO    Table2
FROM    Table1;

이것은 나를 위해 효과가있었습니다.

insert into table1 select * from table2

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

Microsoft SQL Server의 경우 MSDN에서 제공된 구문을 해석하는 법을 배우는 것이 좋습니다. Google을 사용하면 구문을 찾는 것이 더 쉽습니다.

이 특별한 경우에 시도하십시오

Google : 사이트 삽입 : Microsoft.com

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

페이지 상단에 주어진 구문을 해석하기 어려운 경우 예제 ( "선택 및 실행 옵션 사용 및 실행 옵션 사용")로 스크롤하십시오.

[ 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 
        }
    }
}
[;]

이는 사용 가능한 다른 RDBM에 적용 할 수 있어야합니다. 모든 제품 IMO에 대한 모든 구문을 기억하는 데 아무런 의미가 없습니다.

실제로 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

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'
);
select *
into tmp
from orders

멋지게 보이지만 TMP가 존재하지 않는 경우에만 작동합니다 (생성 및 채워집니다). (SQL Sever)

기존 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

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

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)
INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT  COLUMN_NAME
FROM    ANOTHER_TABLE_NAME 
WHERE CONDITION;

Select Sub-Query와 함께 삽입하기위한 두 가지 접근 방식.

  1. SELECT 하위 쿼리 리턴 결과와 함께 한 줄.
  2. SELECT 하위 쿼리 리턴 결과와 함께 여러 행.

1. SELECT SUBQEER RETURNING RETURING과 함께 접근하십시오 한 줄.

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

이 경우 SOLE Sub-Query는 Sum, Max, Avg 등과 같은 조건 또는 SQL 집계 함수를 기준으로 한 행의 결과를 반환한다고 가정합니다. 그렇지 않으면 오류가 발생합니다.

2. SELECT SUBQEER RETURNING 결과와 접근하십시오 여러 행.

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

두 번째 접근법은 두 경우 모두에 효과가 있습니다.

여러 행을 삽입하기 위해 삽입 값 경로로 이동하면 괄호를 사용하여 값을 세트로 구분하십시오.

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

그렇지 않으면 MySQL 객체는 "열 카운트가 1 행에서 값 카운트와 일치하지 않습니다"라는 개체를, 결국 어떻게 해야하는지 알아낼 때 사소한 게시물을 작성하게됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top