Вставьте запись в таблицу, если запись не существует в другой таблице - с дополнительным завихрением
Привет всем, что у вас есть, SQLsuperheros.
Может ли кто-нибудь спасти меня от неминуемой катастрофы и гибели?
Я работаю с Microsoft Access SQL. Я хотел бы выбрать записи в одной таблице (таблица1), которые не отображаются в другой (таблица2).., а затем вставить новые записи в таблицу2, которые основаны на записях в таблице 1, следующим образом:
[таблица1]
file_index: имя_файла
[таблица2]
file_index: celeb_name
Я хочу:
Выберите все записи из таблицы 1, где [filename] - как aud
и чье соответствующее значение [file_index] не
существуют в таблице2 с полем [celeb_name] = 'Audrey Hepburn'
С этим выбором я хочу вставить новую запись в [table2]
[file_index] = [table1]. [file_index]
[celeb_name] = 'Одри Хепберн'
Между [file_index] существует отношение "один-много" в [table1] и [table2]
Одна запись в [table1], для многих в [table2].
Большое спасибо
Ответы
Ответ 1
Будет ли это делать? Очевидно, добавьте квадратные скобки и прочее. Не слишком для доступа к себе.
INSERT INTO table2 (file_index, celeb_name)
SELECT file_index, 'Audrey Hepburn'
FROM table1
WHERE filename = 'aud'
AND file_index NOT IN (SELECT DISTINCT file_index
FROM table2
WHERE celeb_name = 'Audrey Hepburn')
Ответ 2
Как я уже сказал в комментариях, NOT IN не оптимизирован Jet/ACE, и обычно более эффективно использовать OUTER JOIN. В этом случае, поскольку вам нужно отфильтровать внешнюю сторону соединения, вам понадобится подзапрос:
INSERT INTO photos_by_celebrity ( ORIG_FILE_INDEX, celebrity_name )
SELECT tblOriginal_Files.ORIG_FILE_INDEX, 'Audrey Hepburn'
FROM tblOriginal_Files
LEFT JOIN (SELECT DISTINCT ORIG_FILE_INDEX
FROM photos_by_celebrity
WHERE celebrity_name = 'Audrey Hepburn') AS Photos
ON tblOriginal_Files.ORIG_FILE_INDEX = Photos.ORIG_FILE_INDEX
WHERE Photos.ORIG_FILE_INDEX Is Null;
(это может быть не совсем правильно - я ужасен с написанием SQL вручную, особенно с правильной синтаксисом JOIN)
Я должен сказать, однако, что мне интересно, добавит ли это слишком много записей (и то же самое резервирование относится к версии NOT IN).
Ответ 3
В исходном вопросе я изменил свои имена таблиц и полей и вставил квадратные скобки для облегчения чтения.
Ниже приведен окончательный оператор SQL, который работал в формате MS Access. Удивительный результат, спасибо снова Tor!!
INSERT INTO photos_by_celebrity ( ORIG_FILE_INDEX, celebrity_name )
SELECT tblOriginal_Files.ORIG_FILE_INDEX, 'Audrey Hepburn' AS Expr1
FROM tblOriginal_Files
WHERE (((tblOriginal_Files.ORIG_FILE_INDEX) Not In (SELECT DISTINCT ORIG_FILE_INDEX
FROM photos_by_celebrity
WHERE celebrity_name = 'Audrey Hepburn')) AND ((tblOriginal_Files.ORIGINAL_FILE) Like "*aud*"));