首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果条目在另一个表中不存在,则将记录插入到表中-带有额外的扭曲

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

Stack Overflow用户
提问于 2010-02-03 22:24:08
回答 4查看 52.7K关注 0票数 19

嗨,所有你强大的SQLsuperheros在那里..谁能把我从迫在眉睫的灾难和毁灭中拯救出来呢?

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

table1 file_index :文件名

table2 file_index : celeb_name

我想:

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

有了这个选择,我想将一条新记录插入到table2中

file_index = table1.file_index =‘奥黛丽·赫本’

在table1中的file_index和table1中的table2 one record之间存在一对多的关系,在table2中也是如此。

非常感谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-03 22:29:37

这样行吗?显然添加了一些方括号之类的东西。我自己也不太喜欢Access。

代码语言:javascript
复制
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')
票数 19
EN

Stack Overflow用户

发布于 2010-02-04 09:06:45

正如我在评论中所说,NOT in没有被Jet/ACE很好地优化,使用外部连接通常更有效。在这种情况下,因为需要在连接的外部进行过滤,所以需要一个子查询:

代码语言:javascript
复制
  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,尤其是正确的连接语法)

但是,我必须说,我想知道这是否会插入太多的记录(同样的保留适用于NOT IN版本)。

票数 2
EN

Stack Overflow用户

发布于 2010-02-04 08:25:48

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

下面是以MS Access格式工作的最后一条SQL语句。很棒的结果,再次感谢Tor!

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2192560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档