导入访问 csv 没有重复

Posted

技术标签:

【中文标题】导入访问 csv 没有重复【英文标题】:import access csv without duplicates 【发布时间】:2014-02-20 23:34:40 【问题描述】:

我有一份 .csv 格式的股票清单。我无法更改 csv,需要通过 Access 2007-2013 进行所有验证。

我创建了一个追加查询,以将我的数据从 CSV 导入到表中。

INSERT INTO Table1 ( tblfield1, tblfield2, tblfield3, tblfield4 )
SELECT [File#csv].[columnname1], [File#csv].[columnname2], [File#csv].[columnname3], [File#csv].[columnname4]
FROM [File#csv] IN '' [Text;FMT=Delimited;HDR=YES;CharacterSet=437
;DATABASE=c:\your\filepath\here];

我需要它做的是不重复导入,似乎解决方案是将数据导入临时表,然后从那里复制而不重复。

INSERT INTO destTable
SELECT Field1,Field2,Field3,... 
FROM srcTable
WHERE NOT EXISTS(SELECT * 
                 FROM destTable 
                 WHERE (srcTable.Field1=destTable.Field1 and
                       SrcTable.Field2=DestTable.Field2...etc.)
                 )

(SQL 取自:Copy rows from one table to another, ignoring duplicates)

然而,这似乎是一个糟糕的解决方案。有没有办法在查询中使用左连接来同时完成这两项任务?

编辑:我取得了一些进展。

  INSERT INTO tblDestination ( destfield1, destfield2, destfield3, destfield4 )
    SELECT filename1.[field1], filename1.[(field2], filename1.[field3], filename1.[field4]
    FROM [Text;FMT=Delimited;HDR=YES;CharacterSet=437)
    ;DATABASE=D:\your\file\path].filename.csv AS filename1 LEFT JOIN tblDestination ON filename1.[fieldX] = tblDestination.destfieldX
    WHERE (((filename1.[FieldX])= Is Null));

编辑:解决方案是

  INSERT INTO tblDestination ( destfield1, destfield2, destfield3, destfield4 )
    SELECT filename1.[field1], filename1.[(field2], filename1.[field3], filename1.[field4]
    FROM [Text;FMT=Delimited;HDR=YES;CharacterSet=437)
    ;DATABASE=D:\your\file\path].filename.csv AS filename1 LEFT JOIN tblDestination ON filename1.[fieldX] = tblDestination.destfieldX
WHERE (((tblDestination.Field1) Is Null) AND ((tblDestination.Field2) Is Null));

【问题讨论】:

【参考方案1】:

“我需要的是一个 AND 语句,仅当所有字段都相等时才排除该行”

您似乎已经有了正确的想法?

我在 WHERE 子句中使用 OR,因为单个不匹配意味着它是不同的记录

INSERT INTO tblDestination 
(destfield1, destfield2, destfield3, destfield4 )
SELECT filename1.[field1], filename1.[(field2], filename1.[field3], filename1.[field4]
FROM [Text;FMT=Delimited;HDR=YES;CharacterSet=437;
DATABASE=D:\your\file\path].filename.csv] AS filename1 
LEFT JOIN tblDestination 
ON  filename1.[field1] = tblDestination.destfield1
AND filename1.[field2] = tblDestination.destfield2
AND filename1.[field3] = tblDestination.destfield3
AND filename1.[field4] = tblDestination.destfield4
WHERE (
filename1.[Field1] IS NULL OR
filename1.[Field2] IS NULL OR 
filename1.[Field3] IS NULL OR 
filename1.[Field4] IS NULL
);

【讨论】:

这看起来像是正确的 SQL,但我得到“无法加入备忘录、OLE 或超链接对象 [吐出 where 的内容]” 我猜你的其中一个字段一定是备忘录。这使您的其他解决方案变得不那么“糟糕”,因为它有效,而这个无效! 您的解决方案很好。我需要稍微调整一下 SQL。非常感谢你的帮助。而不是 filename1.[field1] 我不得不使用 tblDestination.destfield1

以上是关于导入访问 csv 没有重复的主要内容,如果未能解决你的问题,请参考以下文章

将 CSV 导入数据表 [重复]

将 csv 文件导入列表列表 [重复]

导入的 CSV 的日期转换 [重复]

导入不断增长的 csv 文件列表(),仅在 imoprting 后追加 [重复]

PHP Laravel:如何在将 xl/csv 导入 mysql 时避免重复数据?

将带有分组数据的 CSV 导入 Pandas 数据框 [重复]