Привет ко всему Вы могущественный SQLsuperheros там.. Кто-либо может спасти меня от неотвратимой катастрофы и крушения?
Я работаю с SQL Microsoft Access. Я хотел бы выбрать записи в одной таблице (table1), которые не появляются в другом (table2).. и затем вставьте новые записи в table2, которые основаны на записях в table1, следующим образом:
[table1] file_index: имя файла
[table2] file_index: celeb_name
Я хочу:
Выберите все записи из table1, где [имя файла] похоже на аудитора и чей соответствующий [file_index] значение не существует в table2 с с полем [celeb_name] = 'Audrey Hepburn'
С тем выбором я тогда хочу вставить новую запись в [table2]
[file_index] = [table1]. [file_index] [celeb_name] = 'Audrey Hepburn'
Существует связь "один ко многим" между [file_index] в [table1] и [table2] Одна запись в [table1] многим в [table2].
Большое спасибо
Подойдет ли это? Очевидно, добавьте квадратные скобки и прочее. Не слишком в Access.
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')
Как я уже говорил в комментариях, NOT IN не очень хорошо оптимизирован Jet/ACE и обычно более эффективно использовать ВНЕШЕЕ СОЕДИНЕНИЕ. В этом случае, так как вам нужно отфильтровать внешнюю сторону соединения, вам понадобится подзапрос:
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).
В исходном вопросе я изменил имена таблиц и полей и вставил квадратные скобки для облегчения чтения.
Ниже приведен последний оператор 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*"));