Хотя нет причины (кроме, может быть, из эстетики) использовать INSERT INTO SELECT
при вставке одной строки в таблицу, есть ли разница между использованием этого и INSERT INTO VALUES
?
INSERT INTO SELECT vs 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
Результат тот же, за исключением того, что никакие строки не вставлены, если ключи не существуют.