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

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의 답변 : 제대로 작동해야하며 여러 열과 다른 데이터도 가질 수 있습니다.

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와 잘 작동하며 모든 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 표준의 일부가 아닙니다.


답변

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

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


답변

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

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

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


답변

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

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