Вам не нужны круглые скобки снаружи 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, то часть запроса 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
).