插入SELECT与VALUES

时间:2011-07-11 11:25:33

标签: sql sql-server-2005 insert

虽然在表格中插入单个行时没有理由(可能与美学不同)使用INSERT INTO SELECT,但使用此行和INSERT INTO VALUES之间是否有任何区别?

4 个答案:

答案 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在进行插入时锁定表。因此该表不能同时用于其他进程。

相关问题