从Excel电子表格将数据加载到Access数据库表中时如何按2个字段进行筛选

时间:2020-03-05 18:42:05  来源:igfitidea点击:

好的,这是我的问题,没有因为将公司惯例发布到互联网而被解雇的原因过于具体。

有电子表格。这些已上传到数据库。我需要从上传中过滤出重复项。唯一的方法是确保每个条目的两个字段都与数据库中已有的条目不同。仅仅因为一个字段是相同的,并不意味着它是重复的。有两个特定的字段,可以将它们称为FLDA和FLDB,它们都必须与数据库中的某个条目匹配。我已经可以按一个字段过滤了。我想这必须是一个子查询,但我不确定如何应用它。
这很难描述。请问我们是否不确定我的意思。

解决方案

回答

我有一个类似的问题。我的解决方案是:

  • 导入到登台表中。
  • 删除重复项
  • 将剩余的内容复制到活动表中

这是一个小BFI,但仅能正常工作。

回答

我们如何将它们加载到数据库中?这是用我们自己的代码读取Excel文件的吗?我们可以使用带有正确连接字符串的ADO / ADO.NET读取Excel文件。然后,我们可以使用查询来清除重复数据,以读取数据。

回答

Access以CodeSlave的答案为基础,提供了"查找重复项查询"向导,可以轻松构建查询以清除重复项。

另一种方法是在FLDA和FLDB上建立身份。这将防止重复的条目甚至被写入表中。当然,我们还需要捕获插入操作失败时引发的异常。

回答

查询会适合吗?例如:

INSERT INTO ToUpdate ( Field1, Field2 )
SELECT e.H1, e.H2
FROM (SELECT * FROM [Sheet1$] IN '' [Excel 8.0;HDR=YES;IMEX=1;database=C:\Docs\LTD.xls]) As e
LEFT JOIN ToUpdate ON (e.H2 = ToUpdate.Field2) AND (e.H1 = ToUpdate.Field1)
WHERE ToUpdate.Field1 Is Null AND ToUpdate.Field2 Is Null

回答

是否存在用于识别重复项的字段FLDC?我认为必须有,否则使用(FLDA,FLDB)作为唯一键或者主键将立即解决问题。

假设有这样一个字段,我们可以尝试如下操作:

SELECT T1.FLDA, T1.FLDB, T1.FLDC
FROM Table1 T1, Table1 T2
WHERE T1.FLDA = T2.FLDA
  AND T1.FLDB = T2.FLDB
  AND T1.FLDC <> T2.FLDC

不利之处在于,原件和副本都将由类似的内容返回。如果我们只想查看重复项,则可能必须找出一种识别"原始"行并为此添加另一个或者两个WHERE子句的方法。

如果我们可以获得一个仅提供重复行而不是原始行的查询,那么将其更改为DELETE查询应该非常容易。

回答

为了避免重复输入:

1如果表上还没有主键,则将一个主键放到FLDA和FLDB上(一起)。如果已经有一个不是FLDA和FLDB(在一起)的主键,则在这两个字段的表上放置一个索引,唯一的是,忽略空值no。

2我们可以使用向导或者查询将数据从电子表格导入表中。如果使用导入电子表格向导进行操作,则在导入开始之前,我们会看到以下消息:

"数据库名称无法将所有数据添加到表中。

"由于违反密钥,删除了0条记录中的字段内容,并丢失了(xx)条记录。(这些丢失的记录是重复的,因此在那里没有真正的丢失。)……我们是否仍要继续?"

单击"是"以从电子表格导入行。不会导入任何重复项。

或者,要使用查询进行导入,请将其粘贴到sql视图中的新查询中(菜单:"插入">"查询">"设计视图","关闭"按钮;菜单:"视图">" SQL视图"。)

INSERT INTO tblInput
  SELECT XLS.* 
  FROM tblInput AS T RIGHT JOIN
    [Excel 8.0;IMEX=1;HDR=Yes;DATABASE=c:\data.xls;].[Sheet1$] AS XLS 
    ON T.FLDA = XLS.FLDA AND T.FLDB = XLS.FLDB
  WHERE ISNULL(T.FLDA) AND ISNULL(T.FLDB);

将路径c:\ data.xls更改为路径,将Sheet1 $更改为工作表名称,将tblInput更改为表名称,将FLDA和FLDB更改为列名称。如果电子表格没有标题(列名),则将HDR = Yes更改为HDR = No

回答

我通过使用删除查询,然后使用"从表1中按X具有Y,Z,A进行分组"中进行选择来做到这一点。然后,我为前端用户放置了运行查询按钮。

为所有帮助加油。