Подтвердить что ты не робот

Вставьте запись в таблицу, если запись не существует в другой таблице - с дополнительным завихрением

Привет всем, что у вас есть, 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].

Большое спасибо

4b9b3361

Ответ 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*"));