繁体   English   中英

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

[英]Insert record into table if entry does not exist in another table- with an extra twist

向所有强大的 SQL 超级英雄致敬。

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

[table1] file_index : 文件名

[table2] file_index : 名人名

我想要:

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

通过该选择,我想在 [table2] 中插入一条新记录

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

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

非常感谢

这会吗? 显然添加了一些方括号之类的东西。 我自己不太喜欢访问。

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')

正如我在评论中所说,Jet/ACE 没有很好地优化 NOT IN,使用 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 版本)。

在最初的问题中,我修改了我的表和字段名称,并在其中插入了方括号以使其更易于阅读。

以下是以 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*"));

您可以使用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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM