嗨,所有你强大的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中也是如此。
非常感谢
发布于 2010-02-03 22:29:37
这样行吗?显然添加了一些方括号之类的东西。我自己也不太喜欢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')
发布于 2010-02-04 09:06:45
正如我在评论中所说,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,尤其是正确的连接语法)
但是,我必须说,我想知道这是否会插入太多的记录(同样的保留适用于NOT IN版本)。
发布于 2010-02-04 08:25:48
在最初的问题中,我修改了我的表名和字段名,并插入了方括号以使其更易于阅读。
下面是以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*"));
https://stackoverflow.com/questions/2192560
复制相似问题