虽然在表格中插入单个行时没有理由(可能与美学不同)使用INSERT INTO SELECT
,但使用此行和INSERT INTO VALUES
之间是否有任何区别?
答案 0 :(得分:12)
使用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(......)
语句...... < / p>
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
语句 - 它实际上只是个人偏好的问题,哪种方法更容易/更方便使用....
答案 1 :(得分:7)
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
答案 2 :(得分:5)
我不确定你在寻找什么差异,但我一直用这个来做验证。如果我在具有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
结果是相同的,但如果键不存在则不插入任何行。
答案 3 :(得分:0)
INSERT INTO ... SELECT与INSERT INTO VALUES是考虑到具有大量数据的表在性能水平上观察到的不明显的差异之一:INSERT INTO ... SELECT在进行插入时锁定表。因此该表不能同时用于其他进程。