带有select的SQL插入语句

时间:2009-02-12 17:40:18

标签: sql sql-server-2005

我有以下SQL语句

INSERT INTO A_Table (field1, field2) 
  SELECT field1, field2 FROM B_Table
  WHERE field1 NOT IN (
    SELECT field1 FROM A_Table);

基本上,我需要将所有数据从B_Table复制到A_Table,其中来自B_Table的约束:field1不存在于A_Table中。我需要添加这个约束,因为field1是一个键。

看起来像冲突:不在A_Table中的field1被从B_Table复制到A_Table。在插入过程中,B_Table中复制的记录将存在于A_Table中。不确定它是否有效,或任何意外结果?

也许没关系。最后一个SELECT缓存在临时表中,并且在插入时不刷新?

顺便说一下,我的SQL服务器是Microsoft SQL server 2005。

6 个答案:

答案 0 :(得分:4)

如果你在两个单独的陈述中查看你的查询,也许会有所帮助

选择陈述

  SELECT field1, field2 FROM B_Table
  WHERE field1 NOT IN (
    SELECT field1 FROM A_Table)

给你一些结果

现在您将这些结果插入表格A_table

INSERT INTO A_Table (field1, field2)

,完成此任务的代码是

INSERT INTO A_Table (field1, field2)
  SELECT field1, field2 FROM B_Table
  WHERE field1 NOT IN (
    SELECT field1 FROM A_Table)

基本上就是您发布的内容

答案 1 :(得分:1)

执行SQL语句就像一切都立即发生一样。从某种程度上说,(逻辑上说)指令已被部分执行是没有意义的。

答案 2 :(得分:1)

SELECT的结果集在任何插入之前确定,因此没有冲突。否则,这样的陈述永远不会安全。这有点像代码:

x = 1;
x = x + x + 1;

评估右侧,然后分配给左侧的变量 - 否则谁知道x将如何结束!

答案 3 :(得分:1)

您的insert语句将按照此SQL -

的说明运行
CREATE TABLE #temp1 (id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED , [name] NVARCHAR(20))
CREATE TABLE #temp2 (id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED , [name] NVARCHAR(20))

INSERT INTO #temp1 ([name])
VALUES ('name1')
INSERT INTO #temp1 ([name])
VALUES ('name2')
INSERT INTO #temp1 ([name])
VALUES ('name3')
INSERT INTO #temp1 ([name])
VALUES ('name4')
INSERT INTO #temp2 ([name])
VALUES ('Othername1')
INSERT INTO #temp2 ([name])
VALUES ('Othername2')

INSERT INTO #temp2 (name)
SELECT name FROM #temp1
WHERE id NOT IN (SELECT id FROM #temp2)

SELECT * FROM #temp1
SELECT * FROM #temp2

DROP TABLE #temp1
DROP TABLE #temp2

结果

temp1

id name

1名1 2名2 3名3 4 name4

temp2

id name

1其他名称1 2 Othername2
3名3 4 name4

答案 4 :(得分:0)

看起来该查询在当前表单中不起作用,因为您没有在子查询中指定列。很可能它仍然在执行,它假设你的意思是not in (null)

答案 5 :(得分:0)

它应该可以正常工作。

您应该始终设置一个测试环境,您可以尝试查看发生的情况。在搞乱你的数据库之前,你永远不想依赖陌生人的建议!