etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2022. 1. 14. 12:32
반응형

질문자 :Claude Houle


다른 테이블의 입력을 사용하여 테이블 INSERT INTO 시도하고 있습니다. 이것은 많은 데이터베이스 엔진에서 완전히 가능하지만, 저는 항상 당시의 SQL 엔진( MySQL , Oracle , SQL Server , InformixDB2 )에 대한 올바른 구문을 기억하는 데 어려움을 겪는 것 같습니다.

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



노력하다:

 INSERT INTO table1 ( column1 ) SELECT col1 FROM table2

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

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

  • 신탁
  • MS SQL 서버
  • MySQL
  • 포스트그레스
  • SQLite v3
  • 테라데이타
  • DB2
  • 사이베이스
  • 수직
  • HSQLDB
  • H2
  • AWS 레드시프트
  • SAP HANA
  • 구글 스패너

Claude Houle

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에서도 작동해야 합니다.


travis

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

kylieCatt

내가 본 두 답변은 특히 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'이 아니라 "SOMEONE"입니다. 소유자 이름을 큰따옴표로 묶으면 구분된 식별자처럼 작동합니다. 표준 SQL을 사용하면 구분된 식별자를 여러 위치에서 사용할 수 있습니다. Informix를 사용하면 소유자 이름 주위에만 사용할 수 있습니다. 다른 컨텍스트에서 Informix는 작은 따옴표로 묶인 문자열을 문자열로, 큰 따옴표로 묶은 문자열을 구분된 식별자로 분리하지 않고 작은 따옴표와 큰 따옴표로 묶은 문자열을 모두 문자열로 취급합니다. (물론 완전성을 위해 어떤 값으로든 설정할 수 있는 환경 변수 DELIMIDENT가 있지만 Y가 가장 안전합니다. 큰따옴표는 항상 구분 식별자를 묶고 작은따옴표는 항상 문자열을 묶는다는 것을 나타냅니다.)

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


Jonathan Leffler

선택 하위 쿼리를 사용하여 삽입하는 두 가지 접근 방식.

  1. 하나의 행 으로 결과를 반환하는 SELECT 하위 쿼리를 사용합니다.
  2. 다중 행이 있는 결과를 반환하는 SELECT 하위 쿼리를 사용합니다.

1. 하나의 행 으로 결과를 반환하는 With SELECT 하위 쿼리에 대한 접근 방식.

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

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

2. 여러 행이 있는 결과를 반환하는 With SELECT 하위 쿼리에 대한 접근 방식.

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

두 번째 접근 방식은 두 경우 모두에 적용됩니다.


Mohammed Safeer

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

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

Weslor

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

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

logan

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

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

DB2 , SQL Server , MY SQL , PostgresQL 등의 구문을 따릅니다.


Santhosh

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

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

 INSERT INTO table1 SELECT col1, col2 FROM table2

이것은 작동하지 않습니다( col2 에 대한 값이 지정되지 않음):

 INSERT INTO table1 SELECT col1 FROM table2

MS SQL 서버를 사용하고 있습니다. 다른 RDMS는 어떻게 작동하는지 모르겠습니다.


northben

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

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

Sarvar Nishonboyev

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

 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

RameezAli

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

Dasikely

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

 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;

SWATI BISWAS

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

 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가 아닌 다른 것에 대한 일치가 필요합니다.)


Ciarán Bruen

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

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


Matt

SELECT * INTO 테이블을 사용하여 모든 열을 삽입하려는 경우 이것을 시도할 수 있습니다.

 SELECT * INTO Table2 FROM Table1;

Bharath theorare

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

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


Grungondola

이것은 나를 위해 일했습니다.

 insert into table1 select * from table2

문장은 Oracle과 약간 다릅니다.


elijah7

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에 대한 모든 구문을 기억하는 것은 의미가 없습니다.


Faiz

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

Gaurav

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

 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)

Manish Vadher

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

Pavel

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

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

S.M.Fazle Rabbi

여러 행을 삽입하기 위해 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 개체가 표시되고 결국 이에 대해 수행할 작업을 파악했을 때 사소한 게시물을 작성하게 됩니다.


Sebastian

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

 select * INTO TableYedek From Table

이 메토는 값을 삽입하지만 새로운 카피 테이블을 생성할 때 다릅니다.


Serdin çelik

informix에서는 Claude가 말한 대로 작동합니다.

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

Miroslav Savel

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


Kazakov Vsevolod

INSERT INTO Table_Name (COL1, COL2, COL3, ...) VALUES (Value1, Value2, Value3, ...);

스키마 이름 사용(PostgreSQL에서와 같이):

 INSERT INTO "Schema-name"."Table_Name" (COL1, COL2, COL3, ...) VALUES (Value1, Value2, Value3, ...);

Ajay

출처 : http:www.stackoverflow.com/questions/25969/insert-into-values-select-from

반응형