带select的SQL insert语句

带select的SQL insert语句,sql,sql-server-2005,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); SELECT field1, field2 FROM B_Table WHERE field1 NOT IN ( SELECT field1 FROM A_Table) 基本上,我需要将所有数据

我有下面的SQL语句

INSERT INTO A_Table (field1, field2) 
  SELECT field1, field2 FROM B_Table
  WHERE field1 NOT IN (
    SELECT field1 FROM A_Table);
  SELECT field1, field2 FROM B_Table
  WHERE field1 NOT IN (
    SELECT field1 FROM A_Table)
基本上,我需要将所有数据从B_表复制到A_表,但A_表中不存在约束:B_表中的字段1。我需要添加这个约束,因为field1是一个键

这看起来像是一个冲突:字段1不在从B_表复制到a_表的_表中。在插入过程中,从B_表复制的记录将存在于A_表中。不确定它是否有效,或者是否有任何意外的结果

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


顺便说一句,我的SQL server是Microsoft SQL server 2005。

由于您没有在子查询中指定列,因此该查询在其当前形式下似乎无法工作。很可能它仍在执行,并且假设您的意思是
不在(null)

那么,由于您没有在子查询中指定列,该查询在当前形式下似乎无法工作。很可能它仍在执行,并且假设您的意思是
不在(null)

SQL语句被执行,就好像一切都是立即发生的一样。从逻辑上讲,指令没有部分执行的时间点。

SQL语句的执行就好像一切都是立即发生的一样。(从逻辑上讲)指令没有部分执行的时间点。

SELECT的结果集是在任何插入发生之前确定的,因此不存在冲突。否则,这样的声明将永远不会安全。这有点像代码:

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

对右侧进行求值,然后才将其指定给左侧的变量-否则谁知道x将如何结束

选择的结果集是在任何插入发生之前确定的,因此不存在冲突。否则,这样的声明将永远不会安全。这有点像代码:

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

对右侧进行求值,然后才将其指定给左侧的变量-否则谁知道x将如何结束

它应该可以正常工作


您应该始终设置一个测试环境,在那里您可以尝试一些东西,看看会发生什么。在你搞乱数据库之前,你永远不想依赖陌生人的建议

它应该可以正常工作


您应该始终设置一个测试环境,在那里您可以尝试一些东西,看看会发生什么。在你搞乱数据库之前,你永远不想依赖陌生人的建议

如果您将查询看作两个独立的语句,可能会有所帮助

select语句

INSERT INTO A_Table (field1, field2) 
  SELECT field1, field2 FROM B_Table
  WHERE field1 NOT IN (
    SELECT field1 FROM A_Table);
  SELECT field1, field2 FROM B_Table
  WHERE field1 NOT IN (
    SELECT field1 FROM A_Table)
这会给你一些结果

现在将这些结果插入到表A_表中

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)

这基本上就是你所发布的

如果你把你的查询看作两个独立的语句,也许会有所帮助

select语句

INSERT INTO A_Table (field1, field2) 
  SELECT field1, field2 FROM B_Table
  WHERE field1 NOT IN (
    SELECT field1 FROM A_Table);
  SELECT field1, field2 FROM B_Table
  WHERE field1 NOT IN (
    SELECT field1 FROM A_Table)
这会给你一些结果

现在将这些结果插入到表A_表中

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)

这基本上就是您发布的内容

您的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名称

1名称1
2名称2
3名称3
4名称4

temp2

id名称

1其他名称1
2其他名称2
3名称3

4 name4

您的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名称

1名称1
2名称2
3名称3
4名称4

temp2

id名称

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