질문자 :Claude Houle
다른 테이블의 입력을 사용하여 테이블 INSERT INTO
시도하고 있습니다. 이것은 많은 데이터베이스 엔진에서 완전히 가능하지만, 저는 항상 당시의 SQL
엔진( MySQL , Oracle , SQL Server , Informix 및 DB2 )에 대한 올바른 구문을 기억하는 데 어려움을 겪는 것 같습니다.
기본 데이터베이스에 대해 걱정하지 않고 값을 삽입할 수 있는 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 HouleClaude 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에서도 작동해야 합니다.
travisINSERT
에서 하나의 값만 얻으려면 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선택 하위 쿼리를 사용하여 삽입하는 두 가지 접근 방식.
- 하나의 행 으로 결과를 반환하는 SELECT 하위 쿼리를 사용합니다.
- 다중 행이 있는 결과를 반환하는 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);
WeslorINSERT
쿼리의 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
등의 구문을 따릅니다.
SanthoshSELECT
부분의 모든 열에 대한 값을 제공하는 경우 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
RameezAliINSERT에 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 BruenINSERT INTO yourtable SELECT fielda, fieldb, fieldc FROM donortable;
이것은 모든 DBMS에서 작동합니다.
MattSELECT * 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과 약간 다릅니다.
elijah7Microsoft 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에 대한 모든 구문을 기억하는 것은 의미가 없습니다.
FaizINSERT 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 Vadherselect * 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 çelikinformix에서는 Claude가 말한 대로 작동합니다.
INSERT INTO table (column1, column2) VALUES (value1, value2);
Miroslav SavelPostgres는 다음을 지원합니다: company.monitor에서 *를 선택하여 company.monitor2 테이블을 만듭니다.
Kazakov VsevolodINSERT 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