如果另一个表中不存在条目,则将记录插入表中 - 并进行额外的扭曲

时间:2010-02-03 14:24:08

标签: sql ms-access insert not-exists

嗨,你们所有强大的SQL超级英雄。 任何人都可以救我免受迫在眉睫的灾难和毁灭吗?

我正在使用Microsoft Access SQL。我想在一个表(table1)中选择不出现在另一个表(table2)中的记录..然后在table2中插入基于table1中记录的新记录,如下所示:

[表1] file_index:filename

[表2] file_index:celeb_name

我想:

从table1中选择所有记录,其中[filename]就像 aud 并且其对应的[file_index]值没有 存在于table2中,带有字段[celeb_name] ='Audrey Hepburn'

根据该选择,我想在[table2]

中插入一条新记录

[file_index] = [table1]。[file_index] [celeb_name] ='奥黛丽赫本'

[table1]和[table2]中的[file_index]之间存在一对多的关系 [table1]中的一条记录,[table2]中的许多记录。

非常感谢

4 个答案:

答案 0 :(得分:15)

这会吗?显然添加一些方括号和东西。不要自己进入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')

答案 1 :(得分: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版本)。

答案 2 :(得分:0)

在原始问题中,我修改了我的表格和字段名称,并插入了方括号,以便于阅读。

以下是以MS Access格式工作的最终SQL语句。非常棒的结果,再次感谢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*"));

答案 3 :(得分:0)

您可以使用NOT Exists

从性能角度来看,我认为这是最好的方法。

如下:

INSERT INTO table2 (file_index, celeb_name)
SELECT file_index, 'Audrey Hepburn'
FROM table1
WHERE filename = 'aud'
  AND NOT Exists (SELECT file_index 
                         FROM table2 
                         WHERE celeb_name = 'Audrey Hepburn')