Вставить в ... значения (SELECT ... FROM ...) - PullRequest
1262 голосов
/ 25 августа 2008

Я пытаюсь INSERT INTO таблицу, используя данные из другой таблицы. Хотя это вполне выполнимо для многих механизмов баз данных, мне всегда трудно вспомнить правильный синтаксис для механизма SQL дня ( MySQL , Oracle , SQL Сервер , Informix и DB2 ).

Существует ли синтаксис «серебряной пули», исходящий из стандарта SQL (например, SQL-92 ), который позволил бы мне вставлять значения, не беспокоясь о базовой базе данных?

Ответы [ 23 ]

13 голосов
/ 23 марта 2016

Вот как вставить из нескольких таблиц. В этом конкретном примере таблица соответствия отображается в сценарии «многие ко многим»:

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 является столбцом Identity и неизвестен.)

13 голосов
/ 06 июня 2012

Вот еще один пример, где источник взят более чем из одной таблицы:

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;
12 голосов
/ 17 июня 2016

Вы можете попробовать это, если хотите вставить все столбцы, используя SELECT * INTO таблицу.

SELECT  *
INTO    Table2
FROM    Table1;
12 голосов
/ 20 мая 2015
INSERT INTO yourtable
SELECT fielda, fieldb, fieldc
FROM donortable;

Это работает на всех СУБД

11 голосов
/ 17 октября 2012

Для Microsoft SQL Server я рекомендую научиться интерпретировать SYNTAX, предоставляемый в MSDN. С 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 
        }
    }
}
[;]

Это должно быть применимо к любой другой СУБД, доступной там. Нет смысла запоминать весь синтаксис для всех продуктов IMO.

11 голосов
/ 20 ноября 2013

Это сработало для меня:

insert into table1 select * from table2

Предложение немного отличается от предложения Oracle.

10 голосов
/ 22 марта 2013

Я действительно предпочитаю следующее в 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 (), и вы просто выбираете, какие значения идут в таблице.

9 голосов
/ 24 сентября 2018

Просто используйте скобки для предложения SELECT в 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'
);
8 голосов
/ 18 мая 2014
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
7 голосов
/ 07 июня 2018

Лучший способ вставить несколько записей из любых других таблиц.

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