你不需要外绕SELECT括号:
INSERT INTO mytbl(id, title, notes)
SELECT TOP 1 10, 'test', 'a'
FROM DummyTableWithExactlyOneRecord
WHERE 10 Not IN (select id from mytbl)
要处理重复密钥错误,我添加了TOP 1
子句。
您的查询最初编写的方式,如果10不是mytbl中的ID,那么您的查询的SELECT部分将返回mytbl中每个现有行的记录。因为您没有引用表中的任何字段,它们都将是相同的行。例如,如果有在MYTBL四排,你会:
10 test a
10 test a
10 test a
10 test a
然后,它将尝试为每个返回的行执行插入。第一个会成功,其余的会失败并出现重复键错误。条款中的TOP 1
表示只使用TOP 1记录。在这种情况下订单无关紧要。由于所有的字段都是文字,每一行都是相同的。
请注意,您可以通过将DISTINCT
替换为TOP 1
来实现同样的目的。不过,我认为性能会更差,除非数据库引擎足够聪明才能认识到每行都是相同的。
编辑:DummyTableWithExactlyOneRecord是一个只有一条记录的本地表。正如@onedaywhen在他的评论中指出的那样,如果表格中没有任何记录,那么您将不会插入任何记录。
请注意,如果您可以保证您的虚拟表格总是只有1条记录,那么TOP 1
条款不是必需的。不过,我已经把它留了下来,因为我认为这让读者不知道虚拟表格的内容(我假设你将命名虚拟表格的内容比DummyTableWithExactlyOneRecord
短)。
你愿意和我们分享这个错误? – zmilojko
只是“INSERT INTO语句中的语法错误” – Christine
这可能是围绕SELECT的括号。 – zmilojko