你不需要外繞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