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

Привет ко всему Вы могущественный 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].

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

17
задан bonzo46 3 February 2010 в 14:24
поделиться

3 ответа

Подойдет ли это? Очевидно, добавьте квадратные скобки и прочее. Не слишком в 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')
16
ответ дан 30 November 2019 в 14:00
поделиться

Как я уже говорил в комментариях, 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).

2
ответ дан 30 November 2019 в 14:00
поделиться

В исходном вопросе я изменил имена таблиц и полей и вставил квадратные скобки для облегчения чтения.

Ниже приведен последний оператор 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*"));
0
ответ дан 30 November 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: