INSERT INTO SELECT vs VALUES

Хотя нет причины (кроме, может быть, из эстетики) использовать INSERT INTO SELECT при вставке одной строки в таблицу, есть ли разница между использованием этого и INSERT INTO VALUES?

Ответ 1

Используя подход INSERT INTO ... SELECT, вы можете выбрать свои значения из другой таблицы на основе некоторых критериев.

INSERT INTO dbo.TargetTable(Col1, Col2, ...., ColN)
   SELECT Col1, Col2, ..., ColN
   FROM dbo.SourceTable
   WHERE (some condition)

Это может быть немного проще и более читаемо для записи, вместо того, чтобы извлекать 20 значений из вашей исходной таблицы, вставляйте их во временные переменные, чтобы затем вы могли вызвать оператор INSERT INTO dbo.Destination(....) VALUES(......)...

DECLARE @Value1 INT
DECLARE @Value2 DATETIME
....
DECLARE @ValueN INT

SELECT 
      @Value1 = Col1,
      @Value2 = Col2,
      ....
      @ValueN = ColN
FROM 
    dbo.SourceTable
WHERE
     (some condition) 

INSERT INTO dbo.TargetTable(Col1, Col2, ...., ColN)
VALUES(@Value1, @Value2, ....., @ValueN)

Но в конце - это просто оператор INSERT, который вставляет данные - это действительно просто вопрос личных предпочтений и какой подход проще/удобнее в использовании....

Ответ 2

SELECT позволяет вам сначала проверить наличие

INSERT Target (...)
SELECT keyvalue1, value2
WHERE NOT EXISTS (SELECT * FROM Target WHERE keycol = keyvalue1)

Или 2 набора значений

INSERT Target (...)
SELECT keyvalue1, value2
UNION ALL
SELECT keyvalue1a, value2a

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

Если ваши значения из другой таблицы, то просто INSERT..SELECT.. конечно

Или mix'n'match:

INSERT Target (...)
SELECT col1, col2, @parameter1, @parameter2, col14
FROM Source

Ответ 3

Я не уверен, какие различия вы ищете, но я все время использую это для проверки. Если я вставляю строку в таблицу с отношениями FK, я буду использовать select в ссылочной таблице, чтобы убедиться, что FK существует. Пример:

Вместо

INSERT refTable (Tab1Key,  Tab2Key, ...)
VALUES         (@Tab1Key, @Tab2Key, ...)

Я использую

INSERT refTable (Tab1Key,  Tab2Key, ...)
SELECT          Tab1.Key, Tab2.Key, ...
  FROM Table1 Tab1, Table2 Tab2
 WHERE Tab1.Key = @Tab1Key
   AND Tab2.Key = @Tab2Key

Результат тот же, за исключением того, что никакие строки не вставлены, если ключи не существуют.