programing

... 값에 삽입(SELECT ... FROM ... )

newstyles 2023. 4. 29. 08:57

... 값에 삽입(SELECT ... FROM ... )

하려고 합니다.INSERT INTO 이것이 엔진에서 하지만, 항상 정확처럼 보입니다.SQL오늘의 엔진(MySQL, Oracle, SQL Server, InformixDB2)을 선택할 수 있습니다.

기본 데이터베이스에 대해 걱정하지 않고 값을 삽입할 수 있는 SQL 표준(예: SQL-92)에서 silver-bullet 구문이 제공됩니까?

시도:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2  

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

이 솔루션은 다음과 같은 이점이 있습니다.

  • 오라클
  • MS SQL 서버
  • MySQL
  • 포스트그레스
  • SQLite v3
  • 테라데이터
  • DB2
  • 사이베이스
  • 베르티카
  • HSQLDB
  • H2
  • AWS RedShift
  • SAP HANA
  • 구글 스패너

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 및 Postgre에서만 사용했습니다.SQL, 그래서 그것들은 다뤄져야 합니다.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 및 모든 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를 사용하면 MODE ANSI 데이터베이스에서 소유자 이름이 일반적으로 대문자로 변환되는 약간의 문제가 발생합니다(Informix는 예외입니다).즉, MODE ANSI 데이터베이스(일반적으로 사용되지 않음)에서 다음과 같이 쓸 수 있습니다.

CREATE TABLE someone.table ( ... )

시스템 카탈로그의 소유자 이름은 'Someone'이 아니라 'SOME SOME'입니다.소유자 이름을 큰따옴표로 묶으면 구분된 식별자처럼 작동합니다.표준 SQL을 사용하면 구분된 식별자를 여러 위치에서 사용할 수 있습니다.Informix를 사용하면 소유자 이름 주위에서만 사용할 수 있습니다. 다른 컨텍스트에서는 Informix가 단일 따옴표 문자열을 문자열로 구분하고 이중 따옴표 문자열을 구분 식별자로 구분하지 않고 단일 따옴표 문자열과 이중 따옴표 문자열을 문자열로 처리합니다. (물론 완전성을 위해 환경 변수인 DELMINT,이 값은 모든 값으로 설정할 수 있지만 Y가 가장 안전합니다. 큰따옴표는 항상 구분된 식별자를 둘러싸고 작은따옴표는 항상 문자열을 둘러싸고 있음을 나타냅니다.

MS SQL Server는 대괄호로 묶인 [식별자]를 사용합니다.제가 보기엔 이상하고, 확실히 SQL 표준의 일부가 아닙니다.

선택한 하위 쿼리를 사용하여 에 삽입하기 위한 두 가지 접근 방식입니다.

  1. SELECT 하위 쿼리를 사용하면 하나의 행으로 결과가 반환됩니다.
  2. SELECT 하위 쿼리를 사용하면 다중 행으로 결과가 반환됩니다.

With SELECT 하위 쿼리에 대한 접근법은 하나의 행으로 결과를 반환합니다.

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

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

With SELECT 하위 쿼리에 대한 접근법은 여러 행으로 결과를 반환합니다.

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

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

다른 테이블의 레코드 수가 적은 경우(이 예에서는 하나만) 첫 번째 답변에 추가하려면 다음을 수행합니다.

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

에 에.VALUESINSERT 쿼리, 그사용을 사용합니다.SELECT아래와 같이 문의합니다.

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

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

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

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

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

표 1에 두 개의 열이 있다고 가정해 보겠습니다.이 쿼리는 작동해야 합니다.

INSERT INTO table1
SELECT  col1, col2
FROM    table2

이것은 작동하지 않을 것입니다(값:col2지정되지 않음):

INSERT INTO table1
SELECT  col1
FROM    table2

MS SQL Server를 사용하고 있습니다.나는 다른 RDMS가 어떻게 작동하는지 모릅니다.

다음은 값을 선택과 함께 사용하는 또 다른 예입니다.

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

INSERT에 SELECT 절에 괄호를 사용하면 됩니다.예를 들어 다음과 같습니다.

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

테이블 열 시퀀스가 알려진 경우 간단한 삽입:

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

단순 삽입 언급 열:

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

표(#table2)의 선택된 열 수가 삽입 표(표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 열이고 알 수 없는 경우 ID가 아닌 다른 항목에서 일치해야 합니다.)

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

SELECT  *
INTO    Table2
FROM    Table1;

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 into table1 select * from table2

문장이 오라클의 문장과 조금 다릅니다.

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

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

Microsoft SQL Server의 경우 MSDN에서 제공하는 구문 해석을 배우는 것을 추천합니다. 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에 대한 모든 구문을 기억하는 것은 의미가 없습니다.

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

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

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

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

INSERT INTO CUSTOMER_INFO
   (SELECT CUSTOMER_NAME,
           MOBILE_NO,
           ADDRESS
      FROM OWNER_INFO cm)

표 위치:

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

여러 행을 삽입하기 위해 INSERT VALUE 경로를 사용하는 경우 괄호를 사용하여 값을 집합으로 구분해야 합니다.

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의 값 수와 일치하지 않습니다."라고 표시되어 최종적으로 수행할 작업을 결정할 때 사소한 게시물을 작성하게 됩니다.

먼저 테이블을 작성하면 다음과 같이 사용할 수 있습니다.

  select * INTO TableYedek From Table

새 복사 테이블을 만들 때와는 다르게 값을 삽입할 수 있습니다.

인포믹스에서는 클로드가 말한 대로 작동합니다.

INSERT INTO table (column1, column2) 
VALUES (value1, value2);    

Postgres는 다음을 지원합니다. company.monitor에서 *를 선택하여 table company.monitor2를 만듭니다.

언급URL : https://stackoverflow.com/questions/25969/insert-into-values-select-from