我有以下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。
答案 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)
它应该可以正常工作。
您应该始终设置一个测试环境,您可以尝试查看发生的情况。在搞乱你的数据库之前,你永远不想依赖陌生人的建议!