我有2个表,具有不同的字段名称,但数据相同 . 我想将另一个表中的数据导入到一个表中而不生成重复的行 .
这是我尝试过的(我在Access VBA中工作):
Private Sub Command4_Click()
Dim SQL As String
SQL = "INSERT INTO COMPANY(CompanyNumber, CompanyName)" & _
" SELECT Number, Company" & _
" FROM NEW" & _
" WHERE NOT EXISTS " & _
"(SELECT CompanyNumber, CompanyName FROM COMPANY)"
DoCmd.RunSQL SQL
End Sub
这让我追加0行 . 我究竟做错了什么 ?
4 回答
在表(table_1)上创建一个唯一索引,您要在其中插入必须唯一的所有列 . 然后执行此操作 . 列的名称并不重要,但字段的顺序必须相同 . 如果不是,则必须指定表2中列的顺序 . 将*更改为fieldname1,fieldname3,fieldname2,...
如果您出于某种原因不想在(AField1,AField2)上创建唯一键,则只需将
SELECT 1 FROM TablA WHERE
添加到NOT EXISTS
部分:您还可以尝试排除LEFT JOIN:
Yesssss,我终于让它工作了,这是一整天的噩梦 . 这里是:
@DylanSue感谢所有其他人,你帮助了我很多 . 在进行重复操作时,MS-access看起来很奇怪 . 我添加了
DISTINCT
因为第二个表有许多相同的条目 . 但是,如果我执行两次相同的代码,它会再次导入2行 - 其中一行在两列上都是空的,而在一列中只有一行 . 如何避免两列的空白条目? (如果一列是空白,那么它也应该导入) .自MS-ACCESS以来,解决方案变得更加复杂 .
此外,为了很好地处理NULL,添加了更多的过滤器 . 对于NULL,NULL行,它不会被插入到TableA中,而xx,NULL将被插入 .
简而言之,所需的INSERT INTO ... SELECT语句如下:
附上一个完整的演示 . (我没有MS-ACCESS的环境,这在MySQL 5.7中执行) .
SQL:
输出: